[劍指Offer]面試題61:撲克牌中的順子

從撲克牌中隨機抽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的個數,看0的個數是否可以將非0數列補充成單調遞增數列,即計算數列中的空缺,判斷0的個數是否大等於空缺數(注意是大等於,不是等於)。

代碼

# LeetCode
class Solution:
    def isStraight(self, nums: List[int]) -> bool:
        nums.sort()
        count0, count = nums.count(0), 0
        for i in range(count0, len(nums)-1):
            if nums[i] == nums[i+1]:
                return False
            count += nums[i+1]-nums[i]-1
        if count <= count0:
            return True
        if len(nums[count0:]) == nums[-1]-nums[count0]+1:
            return True
        return False

# 牛客
# -*- coding:utf-8 -*-
class Solution:
    def IsContinuous(self, numbers):
        # write code here
        if not numbers:
            return False
        numbers.sort()
        count = numbers.count(0)
        if count == len(numbers)-1:
            return True
        if numbers[-1] - numbers[count] + 1 == len(numbers):
            for i in numbers[count:]:
                if numbers.count(i) > 1:
                    return False
            return True
        else:
            return False

測試用例
[0,0,0,0,0]
[0,0,0,0,1]
[0,0,0,1, 2]
[0,0,0,1,1]
[0,1,2,2,4]
[1,2,3,4,5]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章