[剑指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]

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