LeetCode:判断是否为扑克牌的顺子

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

解题思路:
此题需要注意大小王的个数可能为5,因为没限制扑克牌的副数.

方法1:
set+遍历
(1)遍历5张牌,若遇到num[i]为0的牌,直接continue;
(2)利用两个变量Max,Min分别统计数组中的最大值和最小值;
(3)考虑到数组中可能存在非零的重复元素,根据insert的返回值,可以判断是否出现重复的元素,若存在,则直接return 
false.
(4)最终根据Max-Min的值是否小于等于4,判断是否为顺子.因为若为顺子,最大可能情况之差为4,例如:1、2、3、4、5;

方法2:
排序+遍历
(1)先对数组进行排序;
(2)利用一个变量n统计大小王的个数;
(3)判断重复非零元素:nums[i]==nums[i+1]
(4)最大元素为nums[4]-最小元素为nums[n],需要提出零元素.
#include <iostream>
#include <set>
#include <vector>
#include <algorithm>

using namespace std;

class Solution {
public:
    bool isStraight(vector<int>& nums){
        set<int> res;
        int MaxNum=0,MinNum=0;
        for(auto& n:nums){
            if(n==0) continue;
            MaxNum=max(MaxNum,n);
            MinNum=min(MinNum,n);
            if(!res.insert(n).second) return false;
        }
        return MaxNum-MaxNum<=4;
    }
      bool isStraightOne(vector<int>& nums){
          
          sort(nums.begin(),nums.end());
          int n=0;//统计大小王的个数
          for(int i=0;i<4;i++){
              if(nums[i]==0) n++;
              if(nums[i]==nums[i+1]) return false;//判断重复
          }
          return nums[4]-nums[n]<=4;
      }
};

int main(int argc,char* argv[]){
    vector<int> nums={0,1,2,5,0};

    return 0;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路上的追梦人

您的鼓励就是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值