题目描述:
输入一串方波信号,求取最长的完全连续交替方波信号,并将其输出,如果有相同长度的交替方波信号,输出任一即可,方波信号高位用1标识,低位用0标识,如图:
说明:
- 一个完整的信号一定以0开始然后以0结尾,即010是一个完整信号,但101,1010,0101不是
- 输入的一串方波信号是由一个或多个完整信号组成
- 两个相邻信号之间可能有0个或多个低位,如0110010,011000010
- 同一个信号中可以有连续的高位,如01110101011110001010,前14位是一个具有连续高位的信号
- 完全连续交替方波是指10交替,如01010是完全连续交替方波,0110不是
输入描述:
shell
输入信号字符串(长度 >= 3 且 <= 1024)
注:输入总是合法的,不用考虑异常情况
输出描述:
shell
输出最长的完全连续交替方波信号串
若不存在完全连续交替方波信号串,输出 -1
示例一:
输入
shell
0010101010110000101000010
输出
shell
01010
先看结果:
通过以下步骤来实现:
- 定义完全连续交替方波 :一个完整的信号一定以
0
开始然后以0
结尾,并且中间部分必须是10
交替。 - 遍历输入字符串:通过遍历字符串来识别和提取符合上述定义的信号。
- 记录最长信号:在遍历过程中记录最长的完全连续交替方波信号。
下面是一个具体的Java代码实现:
java
import java.util.Scanner;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String single = in.nextLine();
System.out.println(findResult(single));
}
private static String findResult(String single) {
// 正则表达式模式,匹配完全连续交替的方波信号
Pattern pattern = Pattern.compile("^(01)+0$");
int maxLength = 0;
String longestWare = "-1";
StringBuilder currentWare = new StringBuilder();
for (char c : single.toCharArray()) {
if (c == '0') {
if (currentWare.length() > 0 && currentWare.charAt(currentWare.length() - 1) == '0') {
if (pattern.matcher(currentWare).matches() && currentWare.length() > maxLength) {
maxLength = currentWare.length();
longestWare = currentWare.toString();
}
// currentWare = new StringBuilder();
// currentWare.setLength(0); 这三行都是把StringBuilder置为空
currentWare.delete(0, currentWare.length());
}
}
currentWare.append(c);
}
// 检查最后一个波形
if (pattern.matcher(currentWare).matches() && currentWare.length() > maxLength) {
longestWare = currentWare.toString();
}
return longestWare;
}
}
java
import java.util.Scanner;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String single = in.nextLine();
System.out.println(findResult(single));
System.out.println(findResult2(single));
}
private static String findResult(String single) {
char[] singles = single.toCharArray();
StringBuilder sb = new StringBuilder();
int maxLength = 0;
String result = "-1";
// ^:表示匹配字符串的开头。(01)+:表示匹配一个或多个连续的01子串。0$:表示匹配以0结尾的字符串。
Pattern pattern = Pattern.compile("^(01)+0$");
for (int i = 0; i < singles.length; i++) {
if (singles[i] == '0') {
// 说明出现标志位00,之前加入的sb的字符串可以构成一个信号串
if (sb.length() > 0 && sb.charAt(sb.length() - 1) == '0') {
if (pattern.matcher(sb).matches() && sb.length() > maxLength) {
result = sb.toString();
maxLength = sb.length();
}
sb.setLength(0);
}
}
sb.append(singles[i]);
}
// 尾部的波形结尾是10,不存在下一个0来让他进入上述的匹配判断里,所以得在这里判断一次。
if (pattern.matcher(sb).matches() && sb.length() > maxLength) {
result = sb.toString();
maxLength = sb.length();
}
return result;
}
}