华为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;
    }
}
相关推荐
Blasit16 分钟前
Qt C++ QStatusbar 显示表示状态的图片
开发语言·c++·qt
木心操作19 分钟前
js使用qrcode与canvas生成带logo的二维码
开发语言·javascript·ecmascript
嵌入式郑工1 小时前
ssh,samba,tftp,nfs服务安装和配置
java·前端·ssh
利刃大大2 小时前
【C语言】内存函数详解与模拟实现
c语言·开发语言
顽疲3 小时前
从零用java实现 小红书 springboot vue uniapp (10)系统消息模块 接收推送消息优化
java·vue.js·spring boot·uni-app
siy23333 小时前
[c语言日寄]精英怪:三子棋(tic-tac-toe)3命慢通[附免费源码]
c语言·开发语言·笔记·学习·算法
疯狂的沙粒3 小时前
如何将一个数组转换为字符串?
开发语言·前端·javascript·柔性数组
shix .3 小时前
python范围
开发语言·python
!!!5253 小时前
Mybatis-底层是如何解决sql注入&增删改查操作--删除操作
java·spring boot·mybatis
源之缘-OFD先行者3 小时前
FreeType 介绍及 C# 示例
开发语言·c#