领先的免费Web技术教程,涵盖HTML到ASP.NET

网站首页 > 知识剖析 正文

「面试题」 按照最长同花色从小到大的原则同花顺序排序的功能

nixiaole 2024-11-26 07:14:54 知识剖析 47 ℃

两幅扑克牌,共108张牌,每张牌编码成一个10进制整数,编码规则如下:

花色顺序:[黑桃:0 红桃:1 梅花:2 方块:3]

每张牌占据1-128中的一个数字。其中1到64为A牌,65到128为B牌,每16个数字占用一个花色,每个花色实际占用13张,比如1-13是黑桃A到黑桃K,17-29是红桃A到红桃K, 以此类推。

大小王分别是 63、64、127、128.

具体牌值分布如下:

黑桃:range(1, 13), 
红桃:range(17, 29), 
梅花:range(33, 45), 
方块:range(49, 61), 
黑桃:range(65, 77), 
红桃:range(81, 93), 
梅花:range(97, 109), 
方块range(113, 125)

通配牌,俗称赖子:大王、小王、所有牌值是2的牌,如红桃2,黑桃2,方片2,梅花2. (2牌如果作为普通牌需要考虑花色,如果作为通配牌可以替代任意牌。)。 通配牌是指可以替代任意牌的牌。

同花顺序排序:同样花色的

牌按照从小到大排列即可,最长的同花顺序是从A到A,比如黑桃同花顺:[1,2,3,4,5,6,7,8,9,10,11,12,13,65]。 注意赖子牌可以替代任意牌与其他牌组成同花顺。注意,只要按照同样花色从小到大排序即可,不一定是必须连续牌值(因为输入部分是随机的部分牌)

以下是几个例子:

输入:[3, 65, 66] 输出:[65, 66, 3]
输入:[34, 98, 82, 35]输出 :[34, 35, 82, 98]
输入:[82, 98, 34, 35]输出:[34, 35, 82, 98 ]
输入:[113, 59, 61, 114, 50] 输出 [50, 59, 114, 61, 113]
输入:[114, 82, 83, 84, 21, 23, 24, 25] 输出 [82, 83, 84, 21, 114, 23, 24, 25]
输入:[114, 82, 83, 84, 21, 23, 24, 25, 66, 27, 28, 93, 81] 输出 [81, 82, 83, 84, 21, 114, 23, 24, 25, 66, 27, 28, 93]

写一个函数, 输入是元素为不重复整数的一维数组,输出也是一个数组,实现.按照最长同花从小到大原则同花顺序排序的功能。


说实话这题目我一开始没看明白。

后来我感觉我看明白了。有大佬指点一二吗?

于是用php写下如下版本:

<?php
Function sortCards(array $input):?array {
    if (empty($input)) {
        return [];
    }

    $arr1 = $arr2 = [];
    // 把第二幅牌的拆出来。
    foreach ($input as $num) {
        // 数据错误
        if ($num < 1 || $num > 128) {
            return [];
        }

        if ($num > 64) {
            $key = $num - 64;
            $map[$key] = $num;
            $arr2[] = $key;
        } else {
            $arr1[] = $num;
        }
    }

    sort($arr1);
    sort($arr2);
    $len1 = count($arr1);
    $len2 = count($arr2);
    $len = max($len1, $len2);

    // 类似合并2个有序链表
    $j = 0;
    for ($i = 0; $i < $len;) {
        if (!isset($arr1[$i]) || !isset($arr2[$j])) {
            break;
        }
        if ($arr1[$i] <= $arr2[$j]) {
            $rs[] = $arr1[$i];
            $i++;
        } else {
            $rs[] = $map[$arr2[$j]];
            $j++;
        }
    }

    while($i < $len1){
      $rs[] = $arr1[$i++];
    }

    while($j<count($arr2)){
      $rs[] = $map[$arr2[$j++]];
    }

    return $rs;
}
$input = [114, 82, 83, 84, 21, 23, 24, 25];
// $input = [82, 98, 34, 35];
 $input = [65, 66, 3];

$rs = sortCards($input);
var_dump($rs);

Tags:

最近发表
标签列表