题目:
从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。
leetcode原题链接
思路概要:
输入数组中的五个元素中,满足下面两个要求,即可构成顺子
- 除‘0’外,最大元素-最小元素<5
- 且,除‘0’外,无重复元素
代码解析
-
创建set()集合,命名为repeat,后续用add()方法
【这里不一定非要创建集合,也可以创建list()列表类型,后续用append()方】 -
初始值
最大元素初始值0
最小元素初始值14 -
对于数组中的五个元素,for循环按序遍历:
-
如果当前遍历的元素是0,跳过,不执行以下四行语句,继续对下一个元素进行遍历
ma = max(ma, num)
mi = min(mi, num)
if num in repeat: return False
repeat.add(num)
- 当前遍历元素不是0,查找最大值和最小值
- 当前遍历元素 此前出现(遍历)过,证明该数组nums不是顺子,return False,函数终止。
if num in repeat: return False
- 当前遍历元素 此前出现(遍历)过,证明该数组nums不是顺子,return False,函数终止。
大佬代码:
附题解链接
class Solution:
def isStraight(self, nums: List[int]) -> bool:
repeat = set()
ma, mi = 0, 14
for num in nums:
if num == 0: continue # 跳过大小王
ma = max(ma, num) # 最大牌
mi = min(mi, num) # 最小牌
if num in repeat: return False # 若有重复,提前返回 false
repeat.add(num) # 添加牌至 Set
return ma - mi < 5 # 最大牌 - 最小牌 < 5 则可构成顺子