剑指offer系列-面试题-61 - 扑克牌中的顺子 (python)

文章目录

  • 1. 题目
  • 2. 解题思路
  • 3. 代码实现
    • 3.1 使用集合
    • 3.2 使用排序
  • 4. 总结
  • 5. 参考文献

1. 题目

从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。

2. 解题思路

详情请看 leetcode 面试题61. 扑克牌中的顺子(集合 Set / 排序,清晰图解)

根据题目得到构成顺子的两个充分条件:

  1. 数组中除0外没有重复数字;
  2. 数组中最大值 - 最小值<5

3. 代码实现

3.1 使用集合

时间复杂度O(n),空间复杂度S(n)

class Solution:
    def isStraight(self, nums: List[int]) -> bool:
        # 1)使用集合解决是否有0以外的重复数字
        records = set() 
        # 2)记录最大、最小值,判断差是否超过5
        max_, min_ = None, None

        for i in nums:
            if i == 0:
                continue
            if i in records:
            	return False
            if not max_ or max_ < i:
                max_ = i
            if not min_ or min_ > i:
                min_ = i
            records.add(i)
                
        return max_ - min_ < 5

3.2 使用排序

class Solution:
	def isStraight(self, nums: List[int]) -> bool:
        """
        看了题解,构成顺子的充分条件是:1)除0外无重复数字;2)最大值-最小值<5
        1. 用集合解决1),用max_和min_记录最大最小值
        2. 排序+遍历解决1)和2)
        """
        joker = 0 # 大小王个数
        nums.sort() 

        for i in range(len(nums)-1):
            if nums[i] == 0:
                joker += 1
            # 判断是否重复
            elif nums[i] == nums[i+1]:
                return False
        return nums[len(nums)-1] - nums[joker] < 5

4. 总结

其实本题的难点就在于1)和2)这两个充分条件,只要能得到:满足这两个充分条件就能构成顺子,后边的代码就不怎么难了。

5. 参考文献

[1] 剑指offer丛书
[2] 剑指Offer——名企面试官精讲典型编程题

你可能感兴趣的:(算法)