华为OD机试真题中的“最长方连续方波信号”题目要求考生在给定的方波信号字符串中,找出最长的完全连续交替方波信号,并将其输出。以下是对该题目的详细解析:
一、题目要求
输入一串方波信号,求取最长的完全连续交替方波信号,并将其输出。如果有相同长度的交替方波信号,输出任一即可。方波信号高位用1标识,低位用0标识。
二、关键说明
- 一个完整的信号一定以0开始然后以0结尾,即010是一个完整信号,但101、1010、0101等不是。
- 输入的一串方波信号是由一个或多个完整信号组成,两个相邻信号之间可能有0个或多个低位,如0110010、011000010等。
- 同一个信号中可以有连续的高位,如01110101011110001010,前14位是一个具有连续高位的信号。
- 完全连续交替方波是指10交替,如01010是完全连续交替方波,0110不是。
三、输入输出
输入:一个表示方波信号的字符串,长度大于等于3且小于等于1024。输入总是合法的,不用考虑异常情况。
输出:最长的完全连续交替方波信号,如果有相同长度的交替方波信号,输出任一即可。如果不存在完全连续交替方波信号串,则输出-1。
四、解题思路
- 遍历输入字符串,找到以0开头的子串。
- 检查子串是否满足完全连续交替的条件,即是否满足“101010…”这样的模式。
- 记录满足条件的子串的长度,并更新最长子串。
- 遍历结束后,输出最长的完全连续交替方波信号。
五、示例
输入:0010101010110000101000010
输出:010101010(或其他相同长度的完全连续交替方波信号)
六、代码实现
public class LongestAlternatingWaveform {
/**
* 寻找最长的交替波形字符串
* 交替波形由'0'和'1'组成,且相邻字符不同
*
* @param signal 输入的信号字符串,只包含'0'和'1'
* @return 返回最长的交替波形字符串如果不存在这样的波形,则返回"-1"
*/
public static String findLongestAlternatingWaveform(String signal) {
// 初始化最大长度为0
int maxLength = 0;
// 初始化最长波形为空字符串
String longestWaveform = "";
// 遍历信号字符串,寻找最长的交替波形
for (int i = 0; i < signal.length() - 1; i++) {
// 当前字符为'0'时,开始构建波形
if (signal.charAt(i) == '0') {
// 构建当前波形字符串,起始为'0'
StringBuilder currentWaveform = new StringBuilder(signal.charAt(i));
// 期望下一个字符为'1'
boolean expectingOne = true;
// 从当前字符的下一个字符开始遍历
for (int j = i + 1; j < signal.length(); j++) {
char currentChar = signal.charAt(j);
// 如果当前字符符合期望(在期望'1'时为'1',在期望'0'时为'0'),则添加到当前波形中
if ((expectingOne && currentChar == '1') || (!expectingOne && currentChar == '0')) {
currentWaveform.append(currentChar);
// 期望的字符切换,'1'变'0'或'0'变'1'
expectingOne = !expectingOne;
} else {
// 如果当前字符不符合期望,停止构建当前波形
break;
}
// 如果当前波形的长度(除去起始的'0')大于已记录的最大长度
if (currentWaveform.length() - 1 > maxLength) {
// 更新最大长度
maxLength = currentWaveform.length() - 1;
// 更新最长波形
longestWaveform = currentWaveform.substring(0, maxLength);
}
}
}
}
// 如果找到了至少一个符合条件的波形,则返回最长的波形;否则返回"-1"
return maxLength > 0 ? longestWaveform : "-1";
}
public static void main(String[] args) {
String signal = "0010101010110000101000010";
String result = findLongestAlternatingWaveform(signal);
System.out.println("最长方连续方波信号: " + result);
}
}
七、运行示例解析
方法解析
findLongestAlternatingWaveform
方法旨在找到一个最长的交替波形字符串,其中交替波形由 ‘0’ 和 ‘1’ 组成,且相邻字符不同。方法逻辑如下:
-
初始化变量:
maxLength
用于记录最长的交替波形长度。longestWaveform
用于存储最长的交替波形字符串。
-
遍历信号字符串:
- 外层循环遍历信号字符串的每个字符(除了最后一个字符,因为需要至少一个后续字符来形成交替波形)。
- 如果当前字符是 ‘0’,则开始尝试构建交替波形。
-
构建当前波形字符串:
- 使用
StringBuilder
来构建当前波形字符串,从当前字符开始。 expectingOne
布尔变量用于指示下一个期望的字符是 ‘1’ 还是 ‘0’。
- 使用
-
内层循环:
- 从当前字符的下一个字符开始遍历,检查每个字符是否符合期望的交替模式。
- 如果字符符合期望,则将其添加到当前波形字符串中,并切换期望的字符。
- 如果字符不符合期望,则停止构建当前波形。
-
更新最长波形:
- 在每次内层循环结束时,检查当前波形的长度(除去起始字符)是否大于已记录的最大长度。
- 如果是,则更新
maxLength
和longestWaveform
。
-
返回结果:
- 如果找到了至少一个符合条件的波形,则返回最长的波形。
- 否则,返回 “-1”。
运行示例解析
给定信号字符串 "0010101010110000101000010"
:
-
外层循环:
- 从索引 0 开始遍历,直到索引 19(因为最后一个字符没有后续字符来形成交替波形)。
-
构建波形:
- 在索引 0,字符是 ‘0’,开始构建波形。
- 内层循环从索引 1 开始,依次检查字符:
- 索引 1:字符是 ‘0’,不符合期望(期望是 ‘1’),停止构建当前波形。
- 在索引 1,字符是 ‘0’,开始构建波形。
- 内层循环从索引 2 开始,依次检查字符:
-
索引 2:字符是 ‘1’,符合期望,添加到波形。
-
索引 3:字符是 ‘0’,符合期望,添加到波形。
-
索引 4:字符是 ‘1’,符合期望,添加到波形。
-
索引 5:字符是 ‘0’,符合期望,添加到波形。
-
索引 6:字符是 ‘1’,符合期望,添加到波形。
-
索引 7:字符是 ‘0’,符合期望,添加到波形。
-
索引 8:字符是 ‘1’,符合期望,添加到波形。
-
索引 9:字符是 ‘0’,符合期望,添加到波形。
-
此时,当前波形为 “10101010”,长度为 8,更新
maxLength
和longestWaveform
。
-
- 后续索引继续尝试构建波形,但都不会超过当前记录的最长波形长度。
-
返回结果:
- 最终,
longestWaveform
为 “10101010”。
- 最终,
输出
最长方连续方波信号: 10101010
这个输出表示在给定的信号字符串中,最长的交替波形字符串是 “10101010”。
八、注意事项
- 在遍历过程中,要注意及时停止遍历以避免超时。
- 要正确处理输入字符串中的多个完整信号以及信号之间的低位。
- 输出结果时,要确保输出的是最长的完全连续交替方波信号。
综上所述,华为OD机试真题中的“最长方连续方波信号”题目是一个考察逻辑分析和字符串处理能力的题目。通过理解题目要求、关键说明和输入输出格式,以及掌握解题思路和注意事项,考生可以顺利地解答该题目。