剑指Offer(第2版)——面试题61:扑克牌中的顺子

题目

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

解题思路

可以总结5张牌是顺子应满足的条件:

  • 数组长度必须为5;
  • 除0外没有重复的牌(用0表示大小王);
  • 顺子中最大值和最小值的差值小于5(不包括0)。
代码
class Solution{
public:
    bool IsContinuous(vector<int> numbers){
        //有5张牌
        if(numbers.size() != 5) return false;

        //扑克牌十四张牌出现次数
        vector<int> count(14,0);

        //辅助变量
        int len = numbers.size(); //数组长度(5)
        int max = -1; // 比最小的0小
        int min = 14; // 比最大的13大

        for(int i = 0; i < len; i++){
            count[numbers[i]]++; //数字numbers[i]出现一次
            if(numbers[i] == 0) continue; //大小王可以重复
            if(count[numbers[i]] > 1) return false; //其他牌不可以重复

            //更新max和min(0不会下来)
            if(numbers[i] > max) max = numbers[i];
            if(numbers[i] < min) min = numbers[i];
        }
        if(max - min < 5) return true;
        
        return false;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值