问题描述
小R有一个字符串 word,该字符串由数字和小写英文字母组成。小R想用空格替换每一个不是数字的字符。然后,他希望统计在替换后剩下的整数中,不同整数的数目。
例如,给定字符串 "a123bc34d8ef34",替换后形成的字符串是 " 123 34 8 34",剩下的整数是 "123"、"34"、"8" 和 "34"。不同的整数有三个,即 "123"、"34" 和 "8"。
注意,只有当两个整数的不含前导零的十进制表示不同,才认为它们是不同的整数。
测试样例
样例1:
输入:word = "a123bc34d8ef34"
输出:3
样例2:
输入:word = "t1234c23456"
输出:2
样例3:
输入:word = "a1b01c001d4"
输出:2
根据题目意思首先得将输入字符串中的非数字字符替换为空格,然后去除首尾空格并按空格分割成数字字符串数组。创建一个HashSet集合,遍历数组,使用正则表达式去除每个数字字符串的前导零,并将其添加到集合中。由于HashSet自动去重,最后返回集合的大小即为不同整数的数量。下面是具体实现步骤:
- 使用正则表达式将输入字符串中所有非数字字符替换为空格。正则表达式
<font style="color:rgb(26, 32, 41);">[^0-9]</font>匹配任何非数字字符,并用<font style="color:rgb(26, 32, 41);">replaceAll</font>方法将其替换为单个空格。 - 去除替换后字符串首尾的空格,并使用空格作为分隔符将字符串分割成字符串数组,每个元素代表一个数字字符串。
- 创建一个
<font style="color:rgb(26, 32, 41);">HashSet</font>集合,用于存储不包含前导零的唯一数字字符串。 - 遍历步骤2中得到的字符串数组:
- 对于数组中的每个元素(即每个数字字符串),首先检查它是否为空(即是否全部由前导零组成)。
- 使用正则表达式
<font style="color:rgb(26, 32, 41);">^0+(?!$)</font>匹配并去除字符串开头的零(但不是全部的零,即如果字符串全是零,则保留一个零)。<font style="color:rgb(26, 32, 41);">^0+</font>匹配一个或多个零,<font style="color:rgb(26, 32, 41);">(?!$)</font>是一个负向前瞻,确保不是字符串的末尾。 - 将处理后的数字字符串添加到
<font style="color:rgb(26, 32, 41);">HashSet</font>集合中。
- 集合
<font style="color:rgb(26, 32, 41);">HashSet</font>自动处理重复项,因此集合的大小即为不同整数的数量。 - 返回
<font style="color:rgb(26, 32, 41);">HashSet</font>集合的大小。
import java.util.*;
class Main {
public static int solution(String word) {
// write code here
String numbersOnly = word.replaceAll("[^0-9]", " ");
String[] numbers = numbersOnly.trim().split("\\s+");
Set<String> uniqueNumbers = new HashSet<>();
for (String number : numbers) {
if (!number.isEmpty()) {
// 去除前导零
if (number.equals("0")) {
uniqueNumbers.add("0");
continue;
}
String numberWithoutLeadingZeros = number.replaceFirst("^0+(?!$)", "");
// 添加到集合中
// System.out.println(numberWithoutLeadingZeros);
uniqueNumbers.add(numberWithoutLeadingZeros);
}
}
return uniqueNumbers.size();
}
public static void main(String[] args) {
System.out.println(solution("a123bc34d8ef34") == 3);
System.out.println(solution("t1234c23456") == 2);
System.out.println(solution("zgw5f0k7rj4q4tsk4dos1u") == 5);
}
}