华为OD机试E卷 - 斗地主之顺子(Java & Python& JS & C++ & C )

题目描述

在斗地主扑克牌游戏中, 扑克牌由小到大的顺序为: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}都是有效的顺子;而{J,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张

### 关于华为ODE中的斗地主顺子题目 #### 题目背景 华为ODE作为最新版本的考,在继承原有ABCD的基础上加入了新的题目类型。其中,“斗地主顺子”是一个典型的算法设计类问题,主要考察考生对于数组操作、排序以及逻辑判断的能力[^1]。 #### 题目描述 给定一组扑克牌编号列表(假设每张牌都有唯一的整数编号),要求从中找出最长的一组连续顺子序列。所谓顺子是指一系列按顺序排列的数字,例如 `[3, 4, 5, 6, 7]` 是一个长度为5的顺子。需要注意的是,输入数据可能包含重复项或者缺失某些中间值的情况。程序应返回能够构成的最大顺子长度及其起始位置[^2]。 #### 解决方案概述 解决该问题的关键在于如何高效处理数据并识别出符合条件的子序列。以下是具体实现方法: 1. **去重与排序**: 使用集合(Set)去除掉所有重复元素后再将其转换成有序形式以便进一步计算。 2. **动态规划思想应用**: 创建辅助变量记录当前已知最大顺子长度以及临时计数值用于遍历过程中的实时跟踪。 3. **边界条件考虑**: 特殊情况如只有一个唯一元素时需单独讨论以防错误判定。 下面给出基于 Python 的解决方案代码示例: ```python def longest_consecutive(nums): if not nums: return 0 num_set = set(nums) # 去除重复元素 max_length = 0 for num in num_set: if num - 1 not in num_set: # 只有当num是某个潜在顺子的第一个成员才进入此分支 current_num = num current_streak = 1 while current_num + 1 in num_set: # 寻找下一个相连的数字直到找不到为止 current_num += 1 current_streak += 1 max_length = max(max_length, current_streak) return max_length # 测用例 test_case = [100, 4, 200, 1, 3, 2] print(longest_consecutive(test_case)) # 输出应该是4因为存在[1, 2, 3, 4] ``` 上述函数通过构建无序集合来快速查找是否存在相邻数字,并利用简单的循环结构实现了时间复杂度接近O(n)的效果。 #### 复杂度分析 - 时间复杂度:由于采用了哈希表(set)来进行常量级查询操作,整体流程大致维持在线性级别即 O(N),这里 N 表示原始数组大小。 - 空间复杂度:额外开辟了一个同等规模的空间存储独一无二的数据副本因此也是 O(N)[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

算法大师

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

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

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

打赏作者

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

抵扣说明:

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

余额充值