(c++)(注释)剑指 Offer 扑克牌中的顺子

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

分析:
顺子是连续的五张牌,大小王可以当任意牌用。
1.出现重复牌,一定错误。 所以考虑去重操作。
大小王都是0,所以去重的时候跳过0,额外统计就好了。

2.确保有五张不重复的牌(0除外),且最大的牌与最小的牌之差小于五,那么五张牌一定连续。

class Solution {
public:
    bool isStraight(vector<int>& nums) 
    {
    //去重,确保五张牌没有重复,大小王不统计在内。
        set<int>res;
        //统计大小王的数量。
        int countOf0=0;
        //为了统计五张牌中的最大值和最小值
       //如果max-min<5,而牌中又无重复,那么我们可以肯定他们是连续的。
        int min=14,max=0;
        for(auto x:nums)
        {
           if(x!=0)
           {
               min=(min<x)?min:x;
               max=(max<x)?x:max;
               res.insert(x);
           }
           // 大小王数目统计。
           else countOf0++;
        }
        //判断语句第一个是判断,大小王加上set里面的牌够不够五张,
        //不够五张说明有重复,不满足条件,第二个判断我们上面说啦。
        //只有满足该条件才能返回true,其余都是fasle。
       if(countOf0+res.size()==5&&max-min<5) return true;
      return false;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值