题目来源牛客网
描述
现在有2副扑克牌,从扑克牌中随机五张扑克牌,我们需要来判断一下是不是顺子。
有如下规则:
- A为1,J为11,Q为12,K为13,A不能视为14
- 大、小王为 0,0可以看作任意牌
- 如果给出的五张牌能组成顺子(即这五张牌是连续的)就输出true,否则就输出false。
例如:给出数据[6,0,2,0,4]
中间的两个0一个看作3,一个看作5 。即:[6,3,2,5,4]
这样这五张牌在[2,6]区间连续,输出true
数据保证每组5个数字,每组最多含有4个零,数组的数取值为 [0, 13]
示例1
输入:[6,0,2,0,4]
返回值:true
示例2
输入:[0,3,2,6,4]
返回值:true
示例3
输入:[1,0,0,1,0]
返回值:false
示例4
输入:[13,12,11,0,1]
返回值:false
解题思路:
1、首先要搞清楚,连续5个数如果要组成顺子的必要条件是:
1)五个数不能是重复的数字(set函数去重,len函数求去重后列表长度)
2)最大值减去最小资必须等于4(sort函数对列表排序)
搞清楚这个规律是解题最关键的部分。
2、其次就是大小王的作用了,对解题产生了比较大的困扰。
两副牌最多有四个王。
先来分析下成为顺子的必须条件:
1)当有四个王的时候:不管剩余一张是什么,都一定能凑成顺子
2)当有三个王的时候:带着0只能有三个不重复值,且最大值减去除0外的最小值必须小于等于4
3)当有两个王的时候:带着0只能有四个不重复值,且最大值减去除0外的最小值必须小于等于4
4)当有一个王的时候:带0带着0只能有五个不重复值,且最大值减去除0外的最小值必须小于等于4
5)当没有王的时候:必须有五个不重复值,且最大值减去最小值必须等于4
除了上述这些成为顺子的条件,其他的都无法成为顺子
将思路转换为代码即可
class Solution:
def IsContinuous(self, numbers):
# write code here
flag = numbers.count(0)
numbers.sort()
l = len(set(numbers))
if flag == 0 and l == 5 and numbers[-1]-numbers[0] == 4:
return True
if flag == 1 and l == 5 and numbers[-1]-numbers[1]<=4:
return True
if flag == 4:
return True
if l == 5-flag+1 and numbers[-1] - numbers[flag]<=4:
return True
return False