1. 程式人生 > 實用技巧 >劍指OFFER_撲克牌中的順子

劍指OFFER_撲克牌中的順子

劍指OFFER_撲克牌中的順子

題目

從撲克牌中隨機抽5張牌,判斷是不是一個順子,即這5張牌是不是連續的。2~10為數字本身,A為1,J為11,Q為12,K為13,而大、小王為 0 ,可以看成任意數字。A 不能視為 14。

示例 1:

輸入: [1,2,3,4,5]
輸出: True

示例 2:

輸入: [0,0,1,2,5]
輸出: True

限制:

陣列長度為 5

陣列的數取值為 [0, 13] .

思路

我首先將陣列排序,然後遍歷此陣列,如果當前數字是0,計算數字為0的個數。如果不是0,就計算前後的數字的差值;

因為陣列完成了排序,所以此差值不會為負數,那麼用此差值減去0的個數,表示0的個數是否能填充此差值,如果0的個數為負數,則表示不能填充了,返回false;其餘情況下為true;

程式碼

class Solution {
public:
    bool isStraight(vector<int>& nums) {
        sort(nums.begin(), nums.end());

        int zeroNums = 0, pre = 0;
        for (int &x:nums) {
            if (x == 0) {
                ++zeroNums;
            } else if (pre != 0) {
                int gap = x-pre-1;
                if (gap == -1) return false;
                zeroNums = zeroNums-gap;
                if (zeroNums < 0) {
                    return false;
                }
            }
            pre = x;
        }
        return true;
    }
};