华为OD机试 - 数字字符串组合倒序 - 正则表达式(Java 2023 B卷 100分)-LMLPHP

专栏导读

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

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

一、题目描述

对数字,字符,数字串,字符串,以及数字与字符串组合进行倒序排列。
字符范围:由 a 到 z, A 到 Z,
数字范围:由 0 到 9

符号的定义:

  • “-”作为连接符使用时作为字符串的一部分,例如“20-years”作为一个整体字符串呈现;
  • 连续出现 2 个 “-” 及以上时视为字符串间隔符,如“out–standing”中的”–“视为间隔符,是 2 个独立整体字符串”out”和”standing”;
  • 除了 1,2 里面定义的字符以外其他的所有字符,都是非法字符,作为字符串的间隔符处理,倒序后间隔符作为空格处理;
  • 要求倒排后的单词间隔符以一个空格表示;如果有多个间隔符时,倒排转换后也只允许出现一个字格间隔符;

二、输入描述

一行字符串。

三、输出描述

根据“符号的定义”规则,倒序输出一行字符串。

四、解题思路

1、熟读题意,大概理解为:

  1. “-”作为连接符使用时作为字符串的一部分;
  2. 连续出现 2 个 “-” 及以上时视为字符串间隔符;
  3. 其它字符作为字符串的间隔符处理,倒序后间隔符作为空格处理;
  4. 要求倒排后的单词间隔符以一个空格表示;如果有多个间隔符时,倒排转换后也只允许出现一个字格间隔符。

2、我理解 “-”作为连接符使用时作为字符串的一部分 的意思是:

  1. 如果“-”在某字符串中间,视为字符串的一部分,要保留;
  2. 如果“-”在某字符串的两头,则不能视为字符串的一部分,要去掉。

3、解决本题的关键是正则表达式的使用。

五、Java算法源码

package com.guor.od;

import java.util.*;

public class OdTest02 {
    /**
     * “-”作为连接符使用时作为字符串的一部分
     * 连续出现 2 个 “-” 及以上时视为字符串间隔符
     * 其它字符作为字符串的间隔符处理,倒序后间隔符作为空格处理
     * 要求倒排后的单词间隔符以一个空格表示;如果有多个间隔符时,倒排转换后也只允许出现一个字格间隔符
     */
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String input = sc.nextLine();
        // 除了“0-9a-zA-Z-”以外的其它字符作为字符串的间隔符处理
        String regular = "[^0-9a-zA-Z-]";
        String[] arr = input.split(regular);
        List<String> list = new ArrayList<String>();
        for (String str : arr) {
            // 删掉每个字符串中的多余空格
            if (str.replaceAll(" ", "").length() == 0) {
                continue;
            }

            // 连续出现 2 个 “-” 及以上时视为字符串间隔符
            if(str.contains("--")){
                // 正则表达式。匹配连续出现 2 个 “-”
                String regex = "-{2,}";
                str = str.replaceAll(regex, " ");
            }

            /**
             * “-”作为连接符使用时作为字符串的一部分
             * 这句话我的理解是如果“-”在某字符串中间,视为字符串的一部分,要保留
             * 如果“-”在某字符串的两头,则不能视为字符串的一部分,要去掉
             */
            if (str.startsWith("-")) {
                str = str.substring(1);
            }

            if (str.endsWith("-")) {
                str = str.substring(0, str.length() - 1);
            }

            for (String item : str.split(" ")) {
                if (item.replaceAll(" ", "").length() == 0) {
                    continue;
                }
                list.add(item);
            }
        }

        // 正序输出,查看特殊字符替换情况
        System.out.println("正序输出,查看特殊字符替换情况:");
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i) + " ");
        }
        System.out.println();
        // 要求倒排后的单词间隔符以一个空格表示
        System.out.println("要求倒排后的单词间隔符以一个空格表示:");
        for (int i = list.size() - 1; i >= 0; i--) {
            System.out.print(list.get(i) + " ");
        }
    }
}

六、效果展示

1、输入

-Nezha loves ^learning–java ## and has—been ** # -doing-it for 10-years-

2、输出

10-years for doing-it been has and java learning loves Nezha

华为OD机试 - 数字字符串组合倒序 - 正则表达式(Java 2023 B卷 100分)-LMLPHP


🏆下一篇:华为OD机试真题 Java 实现【简易内存池】【2023 B卷 200分 考生抽中题】

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

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

华为OD机试 - 数字字符串组合倒序 - 正则表达式(Java 2023 B卷 100分)-LMLPHP

08-19 16:00