华为OD机试 - 恢复数字序列 - 贪心算法(Java 2024 E卷 100分)

在这里插入图片描述

华为OD机试 2024E卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(E卷+D卷+A卷+B卷+C卷)》

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天优快云在线答疑。

一、题目描述

对于一个连续正整数组成的序列,可以

### 华为OD E 数大雁 算法题 解答思路 #### 题目解析 该问题的核心在于通过给定的字符串判断至少有多少只大雁发出了完整的“quack”叫声。每只大雁发出的声音必须严格遵循“q-u-a-c-k”的顺序,且不允许跳过任何字母[^2]。 为了实现这一目标,可以采用一种计数器制来跟踪当前正在发声的大雁数量以及它们所处的状态。具体来说,“q”表示一只新大雁开始发声;而每当完成一次“quack”,就减少一只大雁的数量并增加总的统计数目。 #### 实现方法 以下是基于贪心算法的一种解决方案: 1. **状态定义**: 使用五个变量别记录处于不同阶段(即‘q’, ‘u’, ‘a’, ‘c’, ‘k’)的大雁数量。 2. **遍历输入串**: 对于每一个字符,依据其在“quack”序列中的位置调整对应状态变量的值。 3. **边界条件处理**: 如果发现某个字符无法匹配到合适的位置,则返回错误提示或者认为数据非法。 4. **最终结果计算**: 当整个字符串被扫描完毕之后,检查是否有未完成叫唤循环的情况存在,并据此得出最小所需大雁总数。 下面提供了一个 Python 版本的具体代码示例: ```python def min_ducks(s): quacks = 'quack' n = len(quacks) count = [0]*n # 记录各个阶段的大雁数量 total = 0 # 至少需要多少只大雁 current = 0 # 正在发声的大雁数量 i = 0 # 初始化指针用于追踪'quack' for char in s: pos = quacks.find(char) if pos == -1: continue # 忽略无关字符 elif pos == 0: if current >= total: total += 1 current += 1 count[pos] += 1 else: prev_pos = (pos - 1) % n if count[prev_pos] > 0: count[prev_pos] -= 1 if pos != n-1: count[pos] += 1 else: current -= 1 else: return -1 # 不合法情况 for j in range(n-1): # 检查是否还有未结束的大雁 if count[j]>0: return -1 # 若有则不满足要求 return total # 返回最少大雁数 if __name__ == "__main__": test_str = input().strip() result = min_ducks(test_str) print(result if result!=-1 else "Data Error!") ``` 此程序能够有效解决上述提到的问题,并且时间复杂度接近 O(N),其中 N 表示输入字符串长度,非常适合在此类竞赛环境中应用[^4]。 #### 注意事项 需要注意的是,在实际开发过程中还需要考虑更多异常状况比如空格或者其他干扰项的存在等问题,这里仅作为基础模型展示[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

哪 吒

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

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

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

打赏作者

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

抵扣说明:

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

余额充值