描述
现在有2副扑克牌,从扑克牌中随机五张扑克牌,我们需要来判断一下是不是顺子。
有如下规则:
1. A为1,J为11,Q为12,K为13,A不能视为14
2. 大、小王为 0,0可以看作任意牌
3. 如果给出的五张牌能组成顺子(即这五张牌是连续的)就输出true,否则就输出false。
例如:给出数据[6,0,2,0,4]
中间的两个0一个看作3,一个看作5 。即:[6,3,2,5,4]
这样这五张牌在[2,6]区间连续,输出true
数据保证每组5个数字,每组最多含有4个零,数组的数取值为 [0, 13]
(1)官方题解:集合set + 遍历
两副扑克牌,一共为108张。
随机抽出五张扑克牌,如果要判断这五张牌是不是顺子,那么要判断的就是:
①除了大小王以外(大小王看作任意牌),不可以有重复。
②最大的牌值和最小的牌值之差需要小于5。
所以算法的思路是:遍历所有的牌(跳过0),找到最大值和最小值,然后计算最大值和最小值的差值,判断是否小于5。期间有重复的数值就提前返回False。
class Solution:
def IsContinuous(self, numbers):
# write code here
if not numbers:return False
repeat = set()
ma, mi = 0, 14
for num in numbers:
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 则可构成顺子
(2)讨论组题解:
思路:先统计王的数量,再把牌排序,如果后面一个数比前面一个数大于1以上,那么中间的差值就必须用王来补了。看王的数量够不够,如果够就返回true,否则返回false。
def IsContinuous(self, numbers):
if not numbers:return False
numbers.sort()
zeroNum = numbers.count(0)
for i, v in enumerate(numbers[:-1]):
if v != 0:
if numbers[i+1]==v:return False
zeroNum = zeroNum - (numbers[i + 1] - v) + 1
if zeroNum < 0:
return False
return True