第一反应可能是用 list收集到所有数据后,sort,看能不能成顺子,但是实现起来太麻烦
其实仔细思考一下,不难发现规律
根据题意,此 55 张牌是顺子的 充分条件 如下:
除大小王外,所有牌 无重复 ;
设此 55 张牌中最大的牌为 max ,最小的牌为 min (大小王除外),则需满足
除大小王外,所有牌 无重复 ;
设此 55 张牌中最大的牌为 max ,最小的牌为 min (大小王除外),则需满足
max - min < 5
算法:
1、遍历五张牌,遇到大小王(即 0 )直接跳过。
2、判别重复: 建立一个stack来验证是否有重复 ;
3、获取最大 / 最小的牌: 借助辅助变量 max_value 和 min_value ,遍历统计即可。
2、判别重复: 建立一个stack来验证是否有重复 ;
3、获取最大 / 最小的牌: 借助辅助变量 max_value 和 min_value ,遍历统计即可。
# -*- coding:utf-8 -*-
class Solution:
def IsContinuous(self, numbers):
# write code here
max_value = -float("inf")
min_value = float("inf")
stack = []
for i in numbers:
if i == 0: continue # 跳过大小王
max_value = max(max_value, i) # 最大牌
min_value = min(min_value, i) # 最小牌
if i not in stack: # 添加牌至 stack
stack.append(i)
else:
return False # 若有重复,提前返回 false
return max_value - min_value < 5 # 最大牌 - 最小牌 < 5 则可构成顺子
class Solution:
def IsContinuous(self, numbers):
# write code here
max_value = -float("inf")
min_value = float("inf")
stack = []
for i in numbers:
if i == 0: continue # 跳过大小王
max_value = max(max_value, i) # 最大牌
min_value = min(min_value, i) # 最小牌
if i not in stack: # 添加牌至 stack
stack.append(i)
else:
return False # 若有重复,提前返回 false
return max_value - min_value < 5 # 最大牌 - 最小牌 < 5 则可构成顺子