Skip to content

Latest commit

 

History

History
80 lines (57 loc) · 3.28 KB

45.扑克牌顺子.md

File metadata and controls

80 lines (57 loc) · 3.28 KB

45.扑克牌顺子

题目描述

  • LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子.....LL不高兴了,他想了想,决定大/小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5张牌就可以变成“1,2,3,4,5”(大小王分别看作2和4),“So Lucky!”。LL决定去买体育彩票啦。 现在,要求你使用这幅牌模拟上面的过程,然后告诉我们LL的运气如何, 如果牌能组成顺子就输出true,否则就输出false。为了方便起见,你可以认为大小王是0。
  • 简洁版题目:从扑克牌中随机抽取5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字。

 

解题思路

思路一,排序后统计0和空位的个数,来自《剑指offer》。

  • 首先对数组进行排序,可以调用标准库中的排序算法,然后统计0和空位的个数,在统计的时候如果发现相邻两个数相等了(除0以外),就直接返回false。如果0的个数和空位的个数相等,则是顺子。

思路二,除0以外最大数与最小数的间隔小于5则是顺子(有对子直接返回false),来自牛客网题解:

  • 可以设置一个长度为13的数组,存放1~13这些数字出现的次数,依次遍历数组,遇到0就跳过,遇到对子(某个数字的次数大于1)就返回false,每次更新maxmin的值,遍历完以后如果max-min<5则说明是顺子,否则不是顺子。

 

代码

  • 思路一,排序后统计0和空位的个数,来自《剑指offer》
class Solution {
public:
    bool IsContinuous( vector<int> numbers ) {
        int length = numbers.size();
        if(length != 5) return false;
        sort(numbers.begin(), numbers.end());
        
        // 统计0的个数
        int numberOfZero = 0;
        for(int i=0; i<length && numbers[i]==0; i++) numberOfZero++;
        
        //统计空位的个数
        int small = numberOfZero;
        int big = small+1;
        int numberOfGap = 0;
        while(big<length){
            if(numbers[small]==numbers[big]) return false;
            numberOfGap += numbers[big]-numbers[small]-1;
            small = big;
            big++;
        }
        
        return numberOfGap<=numberOfZero;
    }
};
  • 思路二,除0以外最大数与最小数的间隔小于5则是顺子(有对子直接返回false),来自牛客网题解
class Solution {
public:
    bool IsContinuous( vector<int> numbers ) {
        int length = numbers.size();
        if(length != 5) return false;
        
        int hash[13] = {0};
        int min=14, max=0;
        for(int i=0; i<length; i++){
            if(numbers[i]==0) continue;
            hash[numbers[i]]++;
            if(hash[numbers[i]]>1) return false;
            if(numbers[i]>max) max=numbers[i];
            if(numbers[i]<min) min=numbers[i];
        }
        
        return max-min < 5;
    }
};