华为OD机试 - 数大雁(Java)

这是一道华为在线测评(OD)的编程题,要求根据输入字符串中'quack'的完整出现次数来确定大雁的数量。题目规定字符串仅包含'q', 'u', 'a', 'c', 'k'字符,且必须按顺序完整出现才能计数。若不符合条件,则返回-1。题目提供了Java相关的输入输出描述和示例。" 122543877,11057375,数据价值应用实践:从分析到智能决策,"['数据分析', '数据挖掘', '企业管理', '决策支持', '数据模型']

题目描述

一群大雁往南飞,给定一个字符串记录地面上的游客听到的大雁叫声,请给出叫声最少由几只大雁发出。

具体的:

1.大雁发出的完整叫声为”quack“,因为有多只大雁同一时间嘎嘎作响,所以字符串中可能会混合多个”quack”。

2.大雁会依次完整发出”quack”,即字符串中’q’ ,‘u’, ‘a’, ‘c’, ‘k’ 这5个字母按顺序完整存在才能计数为一只大雁。如果不完整或者没有按顺序则不予计数。

3.如果字符串不是由’q’, ‘u’, ‘a’, ‘c’, ‘k’ 字符组合而成,或者没有找到一只大雁,请返回-1。

输入描述

一个字符串,包含大雁quack的叫声。1 <= 字符串长度 <= 1000,字符串中的字符只有’q’, ‘u’, ‘a’, ‘c’, ‘k’。

输出描述

大雁的数量

用例

输入 quackquack
输出 1
说明
### 华为OD 大雁 真题 #### 题目描述 一群大雁往南飞,给定一个字符串记录地面上听到的大雁叫声。大雁发出的完整叫声为“quack”,因为有多只大雁同一时间叫,所以字符串中可能会混合多个“quack”。大雁会依次完整发出“quack”,即字符串中‘q’, ‘u’, ‘a’, ‘c’, ‘k’这5个字母按顺序完整存在才能计为一次叫声。如果不完整或者没有按顺序则不予计。如果字符串不是由‘q’, ‘u’, ‘a’, ‘c’, ‘k’字符组合而成,或者没有找到大雁的叫声,请返回-1[^4]。 #### 输入描述 一个字符串,包含大雁“quack”的叫声。字符串长度在1到1000之间。字符串中的字符只有‘q’, ‘u’, ‘a’, ‘c’, ‘k’。 #### 输出描述 输出叫声最少由几只大雁发出。 #### 示例 **示例 1** ```plaintext 输入: "quack" 输出: 1 解释: 只有一只大雁发出了完整的“quack” ``` **示例 2** ```plaintext 输入: "quaquackck" 输出: 2 解释: 至少两只大雁分别发出了“quack”和“quac k ck” ``` **示例 3** ```plaintext 输入: "aucaquakck" 输出: -1 解释: 字符串不满足条件,无法形成有效的“quack” ``` #### 解决方案 为了计算最少有多少只大雁发出了这些叫声,可以采用状态的方法来跟踪每一只大雁的状态变化。具体实现如下: ```python def min_ducks(s: str) -> int: if set(s) - {'q', 'u', 'a', 'c', 'k'} or s.count('q') != s.count('u') != s.count('a') != s.count('c') != s.count('k'): return -1 states = [0, 0, 0, 0, 0] max_ducks = current_ducks = 0 for char in s: index = "quack".find(char) if index == 0: states[index] += 1 current_ducks += 1 max_ducks = max(max_ducks, current_ducks) elif states[index - 1] > 0: states[index - 1] -= 1 states[index] += 1 if index == 4: current_ducks -= 1 else: return -1 return max_ducks if all(state == 0 for state in states[:-1]) and sum(states) == 0 else -1 print(min_ducks("quack")) # Output: 1 print(min_ducks("quaquackck")) # Output: 2 print(min_ducks("aucaquakck")) # Output: -1 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

清水乐园

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

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

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

打赏作者

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

抵扣说明:

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

余额充值