剑指offer——扑克牌顺子(c++)

题目描述

从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。
2~10为数字本身,A为1,J为11,Q为12,K为13,大小王可以看做任意数字。
为了方便,大小王均以0来表示,并且假设这副牌中大小王均有两张。
样例1
输入:[8,9,10,11,12]
输出:true

样例2
输入:[0,8,9,11,12]
输出:true

思路

首先将数组排序,然后统计数组中0的个数;最后统计排序之后的数组中相邻数字之间的空缺总数。
如果空缺的总数小于或者等于0的个数,那么这个数组就是连续的;反之不连续。
最后还需注意一点,如果数组的非零数字重复出现,则该数组是不连续的。

代码

class Solution {
public:
    bool isContinuous(vector<int>& nums) {
        if(nums.empty())
            return false;
        sort(nums.begin(), nums.end());
        int cntOfZero = 0, cntOfGap = 0;
        for(int i = 0; i < nums.size(); ++i){
            if(nums[i] == 0)
                ++cntOfZero;
        }
        for(int j = cntOfZero; j < nums.size()-1; ++j){
            if(nums[j] == nums[j+1])
                return false;
            cntOfGap += nums[j+1] - nums[j] - 1;
        }
        return (cntOfZero >= cntOfGap) ? true : false;
    }
};

你可能感兴趣的:(剑指offer(C++实现))