【剑指offer】扑克牌顺子 -- Python 实现

【题目描述】
LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张_)…他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子…LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5张牌就可以变成“1,2,3,4,5”(大小王分别看作2和4),“So Lucky!”。LL决定去买体育彩票啦。 现在,要求你使用这幅牌模拟上面的过程,然后告诉我们LL的运气如何, 如果牌能组成顺子就输出true,否则就输出false。为了方便起见,你可以认为大小王是0。
【解题思路】
令开一个长度为14的数组cnt,用来记录0-13的每张牌的个数,然后从1开始遍历cnt数组,如果遇到某一张牌出现的次数>1,那么不会组成顺子;如果遇到某一张牌出现的次数等于1,那么从这张牌作为起点,往后移动len(numbers)次(此时要注意边界条件,比如"JQK00"的情况,这个稍后再说)。在往后移动的过程中,如果遇到某一张牌出现的次数>1,那么不会组成顺子;如果遇到某一张牌出现的次数=0,那么看大小王替代是否够用。
最后注意一下边界条件,比如“JQK00"的情况,此时,计数数组已经遍历完成,但是顺子的个数小于len(numbers),就要看大小王替代是否够用。用Python实现的代码如下:

# -*- coding:utf-8 -*-
class Solution:
    def IsContinuous(self, numbers):
        # write code here
        cnt = [0 for _ in range(14)]
        for item in numbers:
            cnt[item] += 1
        for i in range(1, len(cnt)):
            # 如果遇到某一张牌出现的次数>1,那么不会组成顺子
            if cnt[i] > 1:
                return False
            
            #如果遇到某一张牌出现的次数等于1,那么从这张牌作为起点,往后移动len(numbers)次
            elif cnt[i] == 1:
                seq = 1
                i += 1
                # 注意边界条件,比如 JQK00的情况
                while seq < len(numbers) and i<len(cnt):
                    # 如果遇到某一张牌出现的次数>1,那么不会组成顺子;
                    if cnt[i] > 1:
                        return False
                    # 如果遇到某一张牌出现的次数=0,那么看大小王替代是否够用
                    elif cnt[i] == 0:
                        if cnt[0]:
                            cnt[0] -= 1
                        else:
                            return False
                    seq += 1
                    i += 1
                    
                # 计数数组已经遍历完成,但是如果seq < len(numbers),就要看大小王替代是否够用。
                if seq == len(numbers) or len(numbers) - seq == cnt[0]:
                    return True
                else:
                    return False
发布了24 篇原创文章 · 获赞 0 · 访问量 234

猜你喜欢

转载自blog.csdn.net/qq_36643449/article/details/104513880