1、题目

 

 

 

2、思路

没啥意思,送的题。

完全按照(1)(2)(3)操作即可,用正则处理字符串。

 

(1)重复字符

(1+)*1,表示多个连续的1串。


用*表示任意个字符(包括0个),
用+表示至少一个字符,
用?表示0个或1个字符,
用{n}表示n个字符,
用{n,m}表示n-m个字符

(2)最长和最短匹配

当正则表达式中包含能接受重复的限定符时,通常的行为是贪婪匹配。

a.*b,匹配最长的,以a开始,以b结束的字符串。贪婪匹配,匹配尽可能多的字符。

a.*?b,匹配最短的,以a开始,以b结束的字符串。懒惰匹配,匹配尽可能少的字符。

(3)懒惰限定符

 

 

好喜欢正则表达式,主要是今天写代码刚用到了正则的最短匹配,这就来了个最长匹配,太好用了。

 

3、代码

package 网易游戏;

import java.util.Scanner;

/**
 * 整理博客,2021年9月17日23:42:22。
 *
 */
public class Main1 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();//数据个数
        String[] arr = new String[n];
        for (int i = 0; i < n; i++) {
            String tmp = in.nextInt() + "";
            System.out.println(getys(tmp));
        }

        //getys("99");
        
    }

    public static String getys(String arr) {
        char[] chars = arr.toCharArray();
        String[] binaryStr = {"0", "1", "10", "11", "100", "101", "110", "111", "1000", "1001"};//0~9的二进制串
        StringBuilder result = new StringBuilder();
        //(1)
        for (int i = 0; i < chars.length; i++) {
            result = result.append(binaryStr[chars[i] - '0']);
        }

        //(2)
        result.reverse();//用StringBuilder或StringBuffer的方法反转,不用写了。
        String r = new String(result);//StringBuilder正则不支持,还要转为String。
        r = r.replaceAll("^(0+)", "");//去掉字符串开头的所有0

        //(3)连续串去重:最长匹配。
        r = r.replaceAll("(1+)*1", "1");
        r = r.replaceAll("(0+)*0", "0");

        return r;
    }
}

 

 

参考:

https://blog.csdn.net/u010454729/article/details/24519767

https://zhuanlan.zhihu.com/p/83080230

 

posted on 2021-09-17 23:40  西伯尔  阅读(134)  评论(0编辑  收藏  举报