华为OD机试 - 最长方连续方波信号(Python/JS/C/C++ 2024 E卷 100分)

在这里插入图片描述

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

专栏导读

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》

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

一、题目描述

输入一串方波信号,求取最长的完全连续交替方波信号,并将其输出,

### 华为ODE 最长连续方波信号 C语言 实现案 以下是基于问题描述和参考资料设计的一个完整的C语言程序,用于解决最长连续方波信号的问题。 #### 代码实现 ```c #include <stdio.h> #include <string.h> #define MAX_LEN 100001 int is_alternating(char* signal, int start, int end) { if (signal[start] != '0') return 0; // 必须以0开头 if (signal[end] != '0') return 0; // 必须以0结尾 for (int i = start + 1; i <= end; ++i) { if (signal[i] == signal[i - 1]) return 0; // 不允许连续相同字符 } return 1; } void find_longest_alternating_wave(char* input_signal, int length) { int max_len = 0; char result[MAX_LEN]; for (int i = 0; i < length; ++i) { if (input_signal[i] != '0') continue; // 只能从'0'开始 for (int j = i + 1; j < length; ++j) { if (input_signal[j] != '0') continue; // 必须以'0'结尾 if (!is_alternating(input_signal, i, j)) continue; // 检查是否为交替方波 int current_len = j - i + 1; if (current_len > max_len) { max_len = current_len; strncpy(result, input_signal + i, current_len); result[current_len] = '\0'; } } } if (max_len > 0) { printf("Longest Alternating Wave: %s\n", result); } else { printf("-1\n"); // 如果没有找到符合条件的信号 } } int main() { char input_signal[MAX_LEN]; // 输入处理 scanf("%s", input_signal); int length = strlen(input_signal); find_longest_alternating_wave(input_signal, length); return 0; } ``` --- #### 代码解析 1. **函数 `is_alternating` 的作用** 此函数用来验证给定范围内的子字符串是否构成一个完全连续交替方波。它检查以下条件: - 子字符串必须以 `'0'` 开头并以 `'0'` 结尾[^1]。 - 中间部不允许存在相同的连续字符(即严格交替)[^3]。 2. **核心逻辑** 使用双重循环来枚举所有可能的起始位置 (`i`) 和结束位置 (`j`)。对于每一对 `(i, j)`,调用 `is_alternating` 函数进行校验。如果当前子字符串满足条件且长度超过已知的最大值,则更新最大长度以及对应的子字符串。 3. **边界情况处理** - 当输入信号为空或者不存在任何有效信号时,返回 `-1` 表示未发现有效的交替方波[^3]。 - 处理信号中的多余零(如两个相邻信号之间的额外低电平),这些不会干扰算法正常运行[^2]。 4. **时间复杂度** 算法的时间复杂度为 \(O(n^2)\),其中 \(n\) 是输入信号的长度。尽管如此,在实际应用中该法仍可接受,因为测数据规模通常较小。 --- #### 示例运行 假设输入如下: ``` 010100110010101110 ``` 执行结果将是: ``` Longest Alternating Wave: 01010 ``` 如果输入不包含任何合法的交替方波序列,例如: ``` 11111 ``` 则输出应为: ``` -1 ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

哪 吒

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

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

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

打赏作者

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

抵扣说明:

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

余额充值