题目解析与代码实现
题目描述
小R有一个字符串 word,该字符串由数字和小写英文字母组成。小R想用空格替换每一个不是数字的字符。然后,他希望统计在替换后剩下的整数中,不同整数的数目。注意,只有当两个整数的不含前导零的十进制表示不同,才认为它们是不同的整数。
示例
-
输入:
word = "a123bc34d8ef34" -
输出:
3- 解释: 替换后形成的字符串是
"123 34 8 34",剩下的整数是"123","34","8"和"34"。不同的整数有三个,即"123","34"和"8"。
- 解释: 替换后形成的字符串是
-
输入:
word = "t1234c23456" -
输出:
2- 解释: 替换后形成的字符串是
"1234 23456",剩下的整数是"1234"和"23456"。不同的整数有两个,即"1234"和"23456"。
- 解释: 替换后形成的字符串是
-
输入:
word = "a1b01c001d4" -
输出:
2- 解释: 替换后形成的字符串是
"1 01 001 4",剩下的整数是"1","01","001"和"4"。不同的整数有两个,即"1"和"4"。
- 解释: 替换后形成的字符串是
思路解析
- 替换非数字字符:将字符串中所有非数字字符替换为空格。
- 分割字符串:使用空格将字符串分割成多个子字符串。
- 去除前导零:去除每个子字符串的前导零。
- 统计不同整数:使用
HashSet来存储不同的整数,最后返回HashSet的大小。
代码实现
java
深色版本
import java.util.HashSet;
import java.util.Set;
class Main {
public static int solution(String word) {
StringBuilder sb = new StringBuilder();
// Step 1: Replace all non-digit characters with spaces
for (char c : word.toCharArray()) {
if (Character.isDigit(c)) {
sb.append(c);
} else {
sb.append(' ');
}
}
// Step 2: Split the string by spaces to get the numbers
String[] numbers = sb.toString().trim().split("\s+");
// Step 3: Use a HashSet to store unique numbers
Set<String> uniqueNumbers = new HashSet<>();
for (String num : numbers) {
if (!num.isEmpty()) {
// Remove leading zeros
num = num.replaceFirst("^0+", "");
uniqueNumbers.add(num);
}
}
// Step 4: Return the count of unique numbers
return uniqueNumbers.size();
}
public static void main(String[] args) {
System.out.println(solution("a123bc34d8ef34") == 3); // true
System.out.println(solution("t1234c23456") == 2); // true
System.out.println(solution("a1b01c001d4") == 2); // true
}
}
代码解析
-
替换非数字字符:
- 使用
StringBuilder构建一个新的字符串,遍历原字符串的每个字符,如果是数字则直接添加到StringBuilder中,否则添加一个空格。
- 使用
-
分割字符串:
- 使用
trim()去除字符串两端的空格,然后使用split("\s+")按照一个或多个空格分割字符串,得到一个包含多个子字符串的数组。
- 使用
-
去除前导零:
- 使用
replaceFirst("^0+", "")去除每个子字符串的前导零,确保整数的表示形式唯一。
- 使用
-
统计不同整数:
- 使用
HashSet存储不同的整数,最后返回HashSet的大小。
- 使用
学习心得
通过这道题的练习,我深刻体会到了字符串处理的重要性。字符串处理是编程中非常常见的任务,掌握好字符串处理的方法可以大大提高编程效率。在这道题中,我们使用了 StringBuilder、split、trim 和正则表达式等工具,这些工具在处理字符串时非常方便。
- StringBuilder:
StringBuilder是一个可变字符串类,可以在不创建新对象的情况下修改字符串内容,非常适合用于频繁修改字符串的场景。 - split:
split方法可以根据指定的正则表达式将字符串分割成多个子字符串,非常灵活。 - trim:
trim方法可以去除字符串两端的空格,确保字符串的整洁。 - 正则表达式:正则表达式是一种强大的文本处理工具,可以用来匹配、查找、替换字符串中的特定模式。
通过这道题的练习,我也学会了如何将多个字符串处理方法结合起来,解决复杂的问题。希望这些经验和技巧能对其他初学者有所帮助。
学习建议
- 多练习:多做一些类似的字符串处理题目,熟悉各种字符串处理方法。
- 查阅文档:遇到不熟悉的字符串处理方法时,可以查阅官方文档,了解其详细用法。
- 实践项目:在实际项目中应用字符串处理技巧,巩固所学知识。
希望这篇博客能对你有所帮助,如果你有任何问题或建议,欢迎在评论区留言交流!