华为OD机试真题 Java 实现【最长的完全交替连续方波信号】【2023 B卷 200分】,附详细解题思路

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、解题思路
    • 五、Java算法源码
    • 六、效果展示
      • 1、输入
      • 2、输出

华为OD机试 2023B卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

最长的完全交替连续方波信号。

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

说明:

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

二、输入描述

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

三、输出描述

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

四、解题思路

  1. 输入信号字符串;
  2. 定义正则表达式匹配完全连续交替方波信号;
  3. 定义最长完全连续交替方波信号的长度maxLength;
  4. 定义最长完全连续交替方波信号的字符串result;
  5. 定义stringbuilder,用于存储当前处理的信号;
  6. 遍历信号字符串的每个字符;
  7. 当前字符是0,且前一个字符也是0,说明一个完整信号结束;
    • 对当前信号进行匹配;
    • 如果匹配到完全连续交替方波信号,并且长度大于之前的最大长度;
    • 更新最大长度;
    • 更新最大长度对应的字符串;
    • 清空当前信号;
    • 将当前字符加入当前信号;
  8. 对最后一个信号进行匹配;
  9. 如果匹配到完全连续交替方波信号,并且长度大于之前的最大长度;
  10. 输出最长的完全连续交替方波信号串。

五、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 实现【最长的完全交替连续方波信号】【2023 B卷 200分】,附详细解题思路_第1张图片


下一篇:华为OD机试真题 Java 实现【路灯照明问题】【2022Q4 100分】,感谢fly晨发现这个问题,并提供更优质的算法

本文收录于,华为OD机试(JAVA)真题(A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

你可能感兴趣的:(搬砖工逆袭Java架构师,华为od,java,开发语言,程序人生,学习)