华为OD上机考试真题(Java)——最长方连续方波信号

题目描述

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

说明:

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

输入描述:

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

输出描述:

shell 复制代码
输出最长的完全连续交替方波信号串
若不存在完全连续交替方波信号串,输出 -1

示例一:

输入

shell 复制代码
0010101010110000101000010

输出

shell 复制代码
01010

先看结果:

通过以下步骤来实现:

  1. 定义完全连续交替方波 :一个完整的信号一定以 0 开始然后以 0 结尾,并且中间部分必须是 10 交替。
  2. 遍历输入字符串:通过遍历字符串来识别和提取符合上述定义的信号。
  3. 记录最长信号:在遍历过程中记录最长的完全连续交替方波信号。

下面是一个具体的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;
    }
}
相关推荐
han_hanker2 分钟前
统一拦截异常 @RestControllerAdvice
java·开发语言·数据库
liu****3 分钟前
一.脚手架介绍以及部分工具使用
开发语言·数据结构·c++·手脚架开发
资深web全栈开发12 分钟前
深入理解 Google Wire:Go 语言的编译时依赖注入框架
开发语言·后端·golang
忘记92616 分钟前
什么是spring boot
java·spring boot·后端
ohoy18 分钟前
EasyPoi 数据脱敏
开发语言·python·excel
Hello World呀19 分钟前
Java实现手机号和身份证号脱敏工具类
java·开发语言
曹牧21 分钟前
Java:serialVersionUID
java·开发语言
ekprada37 分钟前
DAY36 复习日
开发语言·python·机器学习
qq_2562470541 分钟前
Rust 模块化单体架构:告别全局 Migrations,实现真正的模块自治
开发语言·架构·rust
毕设源码-钟学长43 分钟前
【开题答辩全过程】以 公寓出租系统为例,包含答辩的问题和答案
java·eclipse·echarts