目录
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
对数字,字符,数字串,字符串,以及数字与字符串组合进行倒序排列。
字符范围:由 a 到 z, A 到 Z,
数字范围:由 0 到 9
符号的定义:
- “-”作为连接符使用时作为字符串的一部分,例如“20-years”作为一个整体字符串呈现;
- 连续出现 2 个 “-” 及以上时视为字符串间隔符,如“out–standing”中的”–“视为间隔符,是 2 个独立整体字符串”out”和”standing”;
- 除了 1,2 里面定义的字符以外其他的所有字符,都是非法字符,作为字符串的间隔符处理,倒序后间隔符作为空格处理;
- 要求倒排后的单词间隔符以一个空格表示;如果有多个间隔符时,倒排转换后也只允许出现一个字格间隔符;
二、输入描述
一行字符串。
三、输出描述
根据“符号的定义”规则,倒序输出一行字符串。
四、解题思路
1、熟读题意,大概理解为:
- “-”作为连接符使用时作为字符串的一部分;
- 连续出现 2 个 “-” 及以上时视为字符串间隔符;
- 其它字符作为字符串的间隔符处理,倒序后间隔符作为空格处理;
- 要求倒排后的单词间隔符以一个空格表示;如果有多个间隔符时,倒排转换后也只允许出现一个字格间隔符。
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卷 200分 考生抽中题】
🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。