华为OD机试 - 最长的完全交替连续方波信号(Java)

该博客主要介绍了如何解决华为OD机试中的一道算法问题——找到输入方波信号中最长的完全连续交替方波信号。博主通过解析题目要求,提出了使用正则表达式判断完全交替连续方波,并利用栈数据结构遍历输入字符串,通过比较栈顶元素与当前字符,记录符合条件的最长信号。最后给出了Java实现的算法源码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

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

如果有相同长度的交替方波信号,输出任一即可,

方波信号高位用1标识,低位用0标识,如图:

说明:

  1. 一个完整的信号一定以0开始然后以0结尾,即010是一个完整信号,但101,1010,0101不是
  2. 输入的一串方波信号是由一个或多个完整信号组成
  3. 两个相邻信号之间可能有0个或多个低位,如0110010,011000010
  4. 同一个信号中可以有连续的高位,如01110101011110001010,前14位是一个具有连续高位的信号
  5. 完全连续交替方波是指10交替,如01010是完全连续交替方波,0110不是

输入描述

输入信号字符串(长度 >= 3 且 <= 1024):
0010101010110000101000010
注:输入总是合法的,不用考虑异常情况

输出描述

输出最长的完全连续交替方波信号串:01010
若不存在完全连续交替方波信号串,输出 -1

### 华为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、付费专栏及课程。

余额充值