问题描述
小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
接下来进行问题的拆解和分析,我们需要解决如下问题:
- 替换非数字字符:我们需要遍历字符串,将所有非数字字符替换为空格。
- 提取整数:在替换后的字符串中,提取出所有的整数。
- 去重并统计不同整数的数量:使用集合(Set)来存储不同的整数,因为集合会自动去重。
解法很多,我在此列举一种较为基础的实现方法
-
替换非数字字符:
- 使用
StringBuilder来构建新的字符串。 - 遍历原始字符串,如果字符是数字,则添加到
StringBuilder中;否则添加空格。
- 使用
-
提取整数:
- 使用正则表达式
\s+将字符串按空格分割成多个部分。 - 遍历分割后的部分,过滤掉空字符串,并将有效的整数添加到集合中。
- 使用正则表达式
-
统计不同整数的数量:
- 使用
Set来存储不同的整数。 - 最后返回集合的大小。、
- 使用
思路清晰之后,接下来进行代码的编写,函数主体部分如下:
class Main {
public static int solution(String word) {
// 1. 替换非数字字符
StringBuilder sb = new StringBuilder();
for (char c : word.toCharArray()) {
if (Character.isDigit(c)) {
sb.append(c);
} else {
sb.append(' ');
}
}
// 2. 提取整数
String[] parts = sb.toString().split("\\s+");
Set<String> uniqueNumbers = new HashSet<>();
for (String part : parts) {
if (!part.isEmpty()) {
uniqueNumbers.add(part);
}
}
// 3. 统计不同整数的数量
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("a1b01c001d4") == 2);
}
}
该题到此便解答完毕,但是仍存在些许瑕疵。
可能的改进
-
处理前导零:
- 题目要求统计不同的整数,并且不考虑前导零。当前代码没有处理前导零的情况。
- 可以通过在添加到集合之前去除前导零来解决这个问题。
改进后的代码如下
class Main {
public static int solution(String word) {
// 1. 替换非数字字符
StringBuilder sb = new StringBuilder();
for (char c : word.toCharArray()) {
if (Character.isDigit(c)) {
sb.append(c);
} else {
sb.append(' ');
}
}
// 2. 提取整数
String[] parts = sb.toString().split("\\s+");
Set<String> uniqueNumbers = new HashSet<>();
for (String part : parts) {
if (!part.isEmpty()) {
uniqueNumbers.add(part);
}
}
// 3. 统计不同整数的数量
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("a1b01c001d4") == 2);
}
}
关键改进点
-
去除前导零:
java
String trimmedPart = part. replaceFirst("^0+(?!$)", ""); uniqueNumbers.add(trimmedPart);
通过这些改进,代码将能够正确处理前导零的情况,并返回正确的不同整数的数量。
注意
本代码中用到和set和HashSet,所以在主体代码前需要导入对应的数据包:
import java.util.Set;
import java.util.HashSet;
到此本题便解答完毕,该题解法繁多,有更好思路的同学不妨留言说出自己的想法。