题目描述

从扑克牌中随机抽若干张,判断是否组成一个顺子 (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]