塞进裤子ヾ(≧O≦)〃嗷~

0%

剑指offer-61扑克牌中的顺子-python

《剑指offer》python实现系列,全目录

题目描述

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

剑指offer方法:

就是判断一个数组是不是连续的

将大王小王用0表示,我们分析怎样判断5个数字是不是连续的,最直观的方法是把数组排序。值得注意的是,由于0可以当成任意数字,我们可以用0去补满数组中的空缺。如果排序之后的数组不是连续的,即相邻的两个数字相隔若干个数字,那么只要我们有足够的0可以补满这两个数字的空缺,这个数组实际上还是连续的。举个例子,数组排序之后为{0,1,3,4,5},在1和3之间空缺了一个2,刚好我们有一个0,也就是我们可以把它当成2去填补这个空缺。

因此,我们需要做3件事情:

首先把数组排序:

其次统计数组中0的个数;

最后统计排序之后的数组中相邻数字之间的空缺总数。

如果空缺的总数小于或者等于0的个数,那么这个数组就是连续的:反之则不连续

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution:
def IsContinuous(self, numbers):
if not numbers or len(numbers)<=0:
return False
#1.排序
nums = sorted(numbers)
#2 统计数组中0的个数
num_of_zero = nums.count(0)
#3统计排序之后的数组中相邻数字之间的空缺总数
num_of_gap = 0
small = num_of_zero #让下标指向起始位置
big = small +1 # big指向small后一位

while big < len(numbers):
if nums[small] == nums[big]:
#有两张相同的数字不可能连续
return False
num_of_gap += nums[big]-nums[small] -1
small += 1
big += 1
return False if num_of_gap > num_of_zero else True

Solution().IsContinuous([1,3,2,6,4])
if help:小手一抖点个广告 or 大手一挥资助一下