剑指offer:扑克牌中的顺子
题目描述
从扑克牌中随机抽若干张,判断是否组成一个顺子 (straight
),即判断这些牌的数字是否是连续的。特别地,A为1,J为11,Q为12,K为13,大小王以0表示,大小王可以看作赖子(可以变成1 ~ 13
中的任意数字)。
特别地,如果输入为空,返回False
# -*- coding: utf-8 -*-
# @Time : 2019-10-18 23:49
# @Author : Jayce Wong
# @ProjectName : job
# @FileName : isStraight.py
# @Blog : https://sysujayce.github.io/
# @Github : https://github.com/SysuJayce
class Solution:
def isStraight(self, numbers):
if not numbers:
return False
# 因为扑克牌只有1-13,外加一个大小王是0,所以一个14个数字
# 因此我们可以用一个长度为14的哈希表来保存每个数字出现的次数
hash_map = [0] * 14
for num in numbers:
hash_map[num] += 1
need = 0 # 记录两个数字之间的间隔数
last = 14 # 记录上一个数字是什么
for i in range(1, 14):
# 如果这个数字没出现,直接跳过
if hash_map[i] == 0:
continue
# 如果出现了两次及以上,那么一定不是顺子
if hash_map[i] > 1:
return False
# 如果上一次出现的数字跟当前数字间隔大于1,计算需要多少个大小王来填充
if last < i - 1:
need += i - last - 1
last = i # 更新最后一次出现的数字
# 比较拥有的大小王个数和所需个数
return need <= hash_map[0]
- 原文作者:Jayce
- 原文链接:https://sysujayce.github.io/posts/isstraight/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。