【剑指offer】扑克牌中的顺子(数组)

题目描述

从扑克牌中随机抽5张牌,判断是不是一个顺子;即这5张牌是不是连续的。2~10是数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字,为了方便,将大小王定义为数字0。

思路

先将数组进行排序,然后统计0的个数;对于后续的非零递增序列,统计不连续的空缺值(如1和4,空缺为4 -1-1=2),如果0的个数小于等于差值总和,则满足顺子;否则不满足。

代码

class Solution {
public:
    // 如果空缺总数小于等于0的个数,则数组连续
    bool IsContinuous( vector<int> numbers ) {
        if (numbers.size() != 5)
            return false;

        int len = numbers.size();
        bool isCont = true;

        sort(numbers.begin(),numbers.end());    

        int index = 0;  
        while(numbers[index]==0) ++index;    // 统计0的个数

        // 从第2个非零项开始
        for (int i = index+1; i < len; ++i) {
            // 如果有非零重复项则不可能连续
            if (numbers[i] == numbers[i-1])
                return false;
            // 连续项
            if (numbers[i]- numbers[i-1] ==1){
                continue;
            }
            // 不连续但是有0可替代
            if (index>0 && numbers[i] - numbers[i-1] <= index+1)
                --index;
            else if (numbers[i] - numbers[i-1] > index +1)
                return false;
        }
        return isCont;
    }
};

猜你喜欢

转载自blog.csdn.net/zjwreal/article/details/88914814
今日推荐