华为OD机试 - 最长方连续方波信号 | 机试题算法思路 【2023】

本文介绍了华为OD机试中的一道题目——寻找最长的完全连续交替方波信号。文章提供了编码思路、核心知识点、Python代码实现及运行结果,帮助考生理解解题方法。

最近更新的博客

华为OD机试 - 简易压缩算法(Python) | 机试题算法思路 【2023】
华为OD机试题 - 获取最大软件版本号(JavaScript)
华为OD机试 - 猜字谜(Python) | 机试题+算法思路 【2023】
华为OD机试 - 删除指定目录(Python) | 机试题算法思路 【2023】
华为OD机试 - 自动曝光(Python) | 机试题算法思路 【2023】

使用说明

参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。

华为 OD 清单查看地址:blog.youkuaiyun.com/hihell/category_12199275.html

华为OD详细说明:https://dream.blog.youkuaiyun.com/article/details/128980730

od 统一考试 最长方连续方波信号 华为OD机试

题目

输入一串方波信号,求取最长的完全连续交替方波信号,并将其输出,
如果有相同长度的交替方波信号,输出任一即可,方波信号高位用1标识,低位用0标识
如图:

在这里插入图片描述

说明:

  1. 一个完整的信号一定以0开始然后以0结尾,
    即 010 是一个完整的信号,但10110100101</
### 华为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 ``` --- ###
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

梦想橡皮擦

如有帮助,来瓶可乐

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

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

打赏作者

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

抵扣说明:

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

余额充值