题目描述
从扑克牌中随机抽5张,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,小王和大王可以看成任意数字(在输入中处理为0)
思路
《剑指offer》P226
- 先对数组进行排序(代码里是写了一个快排,时间复杂度
O(nlogn)
,也可以使用python自带的sorted()
函数或者list.sort()
函数,时间复杂度也是O(nlogn)
) - 统计
0
的个数 - 计算非
0
元素之间的差值 - 比较差值和
0
的个数之间的关系,注意如果有两个相同的数字,则返回False
。
code
# -*- coding:utf-8 -*-
class Solution:
def IsContinuous(self, numbers):
# write code here
if not numbers or len(numbers) != 5:
return False
# 先排序
self.quickSort(numbers, 0, len(numbers) - 1)
zeroCnt = 0
index = 0
# 计算0的个数
while numbers[index] == 0:
zeroCnt += 1
index += 1
# 计算非零元素之间的差值
curNumber = numbers[index]
index += 1
need = 0
while index < len(numbers):
need += numbers[index] - curNumber - 1
curNumber = numbers[index]
index += 1
if need <= zeroCnt and need >= 0:
return True
return False
def quickSort(self, numbers, low, high):
if low < high:
index = self.partition(numbers, low, high)
if index - 1 > 0:
self.quickSort(numbers, low, index - 1)
if index + 1 < high:
self.quickSort(numbers, index + 1, high)
def partition(self, numbers, left, right):
index = left - 1
for i in range(left, right):
if numbers[i] < numbers[right]:
index += 1
numbers[i], numbers[index] = numbers[index], numbers[i]
index += 1
numbers[right], numbers[index] = numbers[index], numbers[right]
return index