【剑指offer】面试题61 扑克牌顺子

题目要求

一副扑克牌,里面有2个大王,2个小王,随机从中抽出了5张牌,看看能不能抽到顺子,
所谓顺子就是五个连续的数字,如1,2,3,4,5。为了方便测试其中大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。
现在,要求你使用这幅牌模拟上面的过程,如果随机抽出的牌能组成顺子就输出true,否则就输出false。为了方便起见,你可以认为大小王是0。

解题思路

根据题目的介绍,我们只需要做以下三件事就可以清楚的知道五张牌是不是顺子了:
(1)首先对数组中的元素排序
(2)统计数组中的大小王个数(即0的数量)
(3)统计排序之后,相邻元素之间的空缺总数

然后只要比较0的数量和空缺总数之间的关系即可,如果0的个数大于空缺总数那么可以组成顺子,反之不可以。

另外需要注意的是,有对子一定不能构成顺子!

主要代码c++

class Solution {
public:
    bool IsContinuous( vector<int> numbers ) {
        if(numbers.size()!=5)
            return false;
        sort(numbers.begin(), numbers.end());
        
        int NumberofZero = 0; // 初始化都是0!!!
        int NumberofGap = 0;
        //统计0的个数
        for(int i=0; i<numbers.size()&&numbers[i]==0;++i)
            ++NumberofZero;
        //统计Gap的个数
        int small = NumberofZero; //从第一个非0开始统计
        int big = small + 1;
        while(big<numbers.size())
        {
            // 如果遇到相邻两个数相等,即对子不是顺子
            if(numbers[small]==numbers[big])
                return false;
            NumberofGap += numbers[big] - numbers[small] - 1; //Gap个数等于big,small之间的个数
            small = big;
            big++;
        }
        return (NumberofZero < NumberofGap) ? false:true;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_37466121/article/details/88423917