目录
- 专栏导读
- 一、题目描述
- 二、输入描述
- 三、输出描述
- 四、解题思路
- 五、Java算法源码
- 六、效果展示
- 1、输入
- 2、输出
华为OD机试 2023B卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
最长的完全交替连续方波信号。
输入一串方波信号,求取最长的完全连续交替方波信号,并将其输出,如果有相同长度的交替方波信号,输出任一即可,方波信号高位用1标识,低位用0标识。
说明:
- 一个完整的信号一定以0开始然后以0结尾,即010是一个完整的信号,但101,1010,0101不是;
- 输入的一串方波信号是由一个或多个完整信号组成;
- 两个相邻信号之间可能有0个或多个低位,如0110010,011000010;
- 同一个信号中可以有连续的高位,如011101010111100001010,前14为是一个具有连续高位的信号;
- 完全连续交替方波是指10交替,如01010是完全连续交替方波,0110不是
二、输入描述
输入信号字符串(长度 >= 3 且 <= 1024): 0010101010110000101000010
注:输入总是合法的,不用考虑异常情况
三、输出描述
输出最长的完全连续交替方波信号串:01010 若不存在完全连续交替方波信号串,输出-1。
四、解题思路
- 输入信号字符串;
- 定义正则表达式匹配完全连续交替方波信号;
- 定义最长完全连续交替方波信号的长度maxLength;
- 定义最长完全连续交替方波信号的字符串result;
- 定义stringbuilder,用于存储当前处理的信号;
- 遍历信号字符串的每个字符;
- 当前字符是0,且前一个字符也是0,说明一个完整信号结束;
- 对当前信号进行匹配;
- 如果匹配到完全连续交替方波信号,并且长度大于之前的最大长度;
- 更新最大长度;
- 更新最大长度对应的字符串;
- 清空当前信号;
- 将当前字符加入当前信号;
- 对最后一个信号进行匹配;
- 如果匹配到完全连续交替方波信号,并且长度大于之前的最大长度;
- 输出最长的完全连续交替方波信号串。
五、Java算法源码
package com.guor.od;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class OdTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 输入信号字符串
String signal = sc.nextLine();
// 定义正则表达式匹配完全连续交替方波信号
Pattern pattern = Pattern.compile("^(01)+0$");
// 最长完全连续交替方波信号的长度
int maxLength = 0;
// 最长完全连续交替方波信号的字符串
String result = "-1";
// 用于存储当前处理的信号
StringBuilder builder = new StringBuilder();
for (int i = 0; i < signal.length(); i++) {
char c = signal.charAt(i);
// 当前字符是0,且前一个字符也是0,说明一个完整信号结束
if (c == '0' && builder.length() > 0 && builder.charAt(builder.length() - 1) == '0') {
// 对当前信号进行匹配
Matcher matcher = pattern.matcher(builder.toString());
// 如果匹配到完全连续交替方波信号,并且长度大于之前的最大长度
if (matcher.find() && builder.length() > maxLength) {
// 更新最大长度
maxLength = builder.length();
// 更新最大长度对应的字符串
result = builder.toString();
}
// 清空当前信号
builder = new StringBuilder();
}
// 将当前字符加入当前信号
builder.append(c);
}
// 对最后一个信号进行匹配
Matcher matcher = pattern.matcher(builder.toString());
// 如果匹配到完全连续交替方波信号,并且长度大于之前的最大长度
if (matcher.find() && builder.length() > maxLength) {
// 更新最大长度对应的字符串
result = builder.toString();
}
// 输出最长的完全连续交替方波信号串
System.out.println(result);
}
}
六、效果展示
1、输入
00101010101100001010010
2、输出
01010
🏆下一篇:华为OD机试真题 Java 实现【路灯照明问题】【2022Q4 100分】,感谢fly晨发现这个问题,并提供更优质的算法
🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。