【华为机试题】 [Python] 斗地主之顺子

题目描述

在斗地主只扑克牌游戏中,扑克牌由小到大的顺序为:3.4,5.6,7.8,9,10.J,Q.K.A.2,玩家可以出的扑克牌阵型有:单张、对子、顺子、飞机、炸弹等。

其中顺子的出牌规则为:由至少5张由小到大连续递增的 扑克牌只 组成,且不能包含2。

例如:(3.4,5,6,7}、(3.4,5,6,7,8,9,10,J,Q,K,A}都是有效的顺子;而{,Q,K,A,2}、(2,3,4,5,6}、(3,4,5,6}、(3,4,5.6,8)等都不是顺子给定一个包含 13 张牌的数组,如果有满足出牌规则的顺子,请输出顺子。

如果存在多个顺子,请每行输出一个顺子,且需要按顺子的第一张牌的大小(必须从小到大)依次输出。

如果没有满足出牌规则的顺子,请输出NO。

输入描述:

13张任意顺序的扑克牌,每张扑克牌数字用空格隔开,每张扑克牌的数字都是合法的,并且不包括大小王:2 9 J 2 3 4 K A 7 9  A 5 6不需要考虑输入为异常字符的情况

输出描述:

组成的顺子,每张扑克牌数字用空格隔开:3 4 5 6 7

示例1

输入

2 9 J 2 3 4 K A 7 9 A 5 6

输出

3 4 5 6 7

说明

13张牌中,可以组成的顺子只有1组:3 4 5 6 7.

示例2

输入

2 9 J 1 0 3 4 K A 7 Q A 5 6

输出

3 4 5 6 7

9 10 J Q K A

说明

13张牌中,可以组成2组顺子,从小到大分别为:3 4 5 6 7和9 10 J Q K A

示例3

输入

2 9 9 9 3 4 K A 10 Q A 5 6

输出

No

说明

13张牌中,无法组成顺子。

题目分析:

- 扑克牌按从小到大的顺序排列为:3, 4, 5, 6, 7, 8, 9, 10, J, Q, K, A。牌 2 不能用于顺子。

- 顺子的规则是:至少由5张连续递增的牌组成,例如 (3, 4, 5, 6, 7)。

- 需要找出所有可能的顺子组合,每个顺子中的牌不能重复使用。
"""

程序

class Solution:
    def func(self, lst):
        from collections import Counter

        # 返回值
        ans = []
        # 转换成数字更好判断连续性
        map_dict = {
   
   
            'J': 11,
            'Q': 12,
            
华为OD中,关于“斗地主顺子”的题目主要考察的是对数组处理和逻辑判断的能力。题目要求编写程序来判断一组牌是否能组成顺子,即是否可以形成连续的五牌,其中可以包含大小王作为万能牌[^1]。 ### 题目描述 给定一个包含5牌的数组,每牌的范围是1到13(不考虑花色),0表示大小王。请判断这5牌是否能组成顺子顺子的定义是五牌中没有重复的牌,并且可以形成一个连续的序列[^2]。 ### 解题思路 1. **排序**:首先将给定的牌进行排序。 2. **统计零的数量**:计算数组中0的数量,这些0可以作为任意牌来填补空缺。 3. **检查重复**:遍历数组,检查是否有重复的非零牌,如果存在重复则直接返回False。 4. **计算空缺数量**:从第一个非零牌开始,计算相邻牌之间的空缺数量。 5. **判断是否满足条件**:如果空缺数量小于等于零的数量,则可以组成顺子;否则不能组成顺子[^3]。 ### Python代码示例 ```python def is_straight(cards): cards.sort() zero_count = cards.count(0) for i in range(1, len(cards)): if cards[i] == 0: continue if cards[i] == cards[i - 1]: return False gap_count = 0 for i in range(zero_count, len(cards) - 1): gap_count += cards[i + 1] - cards[i] - 1 return gap_count <= zero_count # 测用例 print(is_straight([0, 0, 1, 2, 5])) # 输出: True print(is_straight([1, 2, 2, 3, 4])) # 输出: False ``` ### 相关问题 1. 如何在Python中实现一个函数来判断扑克牌是否为顺子? 2. 在斗地主游戏中,如何处理大小王作为万能牌的情况? 3. 有哪些常见的华为OD试题目及其解法? 4. 如何优化代码以提高判断顺子的效率? 5. 在编程中,如何处理数组中的重复元素问题? 希望这些内容能够帮助您理解和解决华为OD中的相关问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AITyson

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值