【2025年B卷】OD-100分-斗地主之顺子

116 篇文章 ¥39.90 ¥99.00

专栏订阅🔗 -> 赠送OJ在线评测

在这里插入图片描述

斗地主之顺子

问题描述

卢小姐喜欢玩斗地主扑克牌游戏。在这个游戏中,扑克牌由小到大的顺序为: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}(少于5张)、{3,4,5,6,8}(不连续)等都不是有效的顺子。

现在,卢小姐手中有13张牌,她想知道能否从中组成顺子。如果

### 关于华为OD机试E中的斗地主顺子题目 #### 题目背景 华为OD机试E作为最新版本的考试试,在继承原有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、付费专栏及课程。

余额充值