扑克牌顺子

Posted hesper

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了扑克牌顺子相关的知识,希望对你有一定的参考价值。

扑克牌顺子

题目描述

从扑克牌中随机抽取5张牌, 判断是不是一个顺子, 即这5张牌是不是连续的. 2~10为数字本身, A为1, J为11, Q为12, K为13, 大小王看成是任意数字并在数组中用0表示

class Solution {
public:
    bool IsContinuous( vector<int> numbers ) {
        if(numbers.size() != 5) return false;
        int min = 14;
        int max = -1;
        int flag = 0;
        for(int i = 0; i < numbers.size(); i++) {
            int number = numbers[i];
            if(number < 0 || number > 13) return false;
            if(number == 0) continue;
            if(((flag >> number) & 1) == 1) return false;
            flag |= (1 << number);
            if(number > max) max = number;
            if(number < min) min = number;
            if(max - min >= 5) return false;
        }
        return true;
    }
};
class Solution {
public:
    bool IsContinuous( vector<int> numbers ) {
        if(numbers.empty()) {
            return false;
        }
        vector<int> vt;
        vt.resize(14);
        int len = numbers.size();
        int max = -1;
        int min = 14;
        for (int i = 0; i < len; i++) {
            vt[numbers[i]]++;
            if(0 == numbers[i]) {
                continue;
            }
            if (vt[numbers[i]] > 1) {
                return false;
            }
            if (numbers[i] > max) {
                max = numbers[i];
            }
            if (numbers[i] < min) {
                min = numbers[i];
            }
        }
        if (max - min < 5) {
            return true;
        }
        return false;
    }
};

判断条件比下面那个简化多了, 使用一个变量记录排好序后数组相邻两个元素的差值

class Solution {
public:
    bool IsContinuous( vector<int> numbers ) {
        if (4 >= numbers.size()) {
            return false;
        }
        
        sort(numbers.begin(), numbers.end());
        
        int numbersOfZero = 0;
        int numbersOfGape = 0;
        int i = 0;
        while (i < (numbers.size() - 1)) {
            if (0 == numbers[i]) {
                numbersOfZero++;
                i++;
                continue;
            }
            
            if (numbers[i] == numbers[i+1]) {
                return false;
            }
            numbersOfGape = numbersOfGape + numbers[i+1] - numbers[i] - 1;
            i++;
        }
        
        return (numbersOfGape > numbersOfZero ? false : true);
    }
};

有点作弊了, 使用了排序函数, 最后的输出真是层层围堵, 各种判断

class Solution {
public:
    bool IsContinuous( vector<int> numbers ) {
        if (4 >= numbers.size()) {
            return false;
        }
        
        sort(numbers.begin(), numbers.end());
        
        int numberOfZero = 0;
        int i = 0;
        while (i < (numbers.size() - 1)) {
            if (0 == numbers[i]) {
                numberOfZero++;
                i++;
                continue;
            }
            
            if (numbers[i] == numbers[i+1]) {
                return false;
            }
            else if (1 == numbers[i+1] - numbers[i]) {
                i++;
            }
            else if ((numberOfZero > 0) && (numbers[i+1] - numbers[i] <= numberOfZero + 1)) {
                numberOfZero = numberOfZero - (numbers[i+1] - numbers[i]) + 1;
                i++;
            }
            else {
                return false;
            }
        }
        
        return true;
    }
};

以上是关于扑克牌顺子的主要内容,如果未能解决你的问题,请参考以下文章

扑克牌顺子

扑克牌中的顺子

扑克牌中的顺子

扑克牌中的顺子

剑指 Offer 45. 把数组排成最小的数 剑指 Offer 61. 扑克牌中的顺子 剑指 Offer 40. 最小的k个数

【动漫算法】扑克牌的顺子