问题描述
小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)存储转换后的整数,利用集合的特性自动去除重复的整数。
- 结果输出:集合的大小即为不同整数的数目。
Java 程序代码
import java.util.Set;
import java.util.HashSet;
public class Main {
public static void main(String[] args) {
String[] testSamples = {"a123bc34d8ef34", "t1234c23456", "a1b01c001d4"};
for (String sample : testSamples) {
System.out.println("输入:word = \"" + sample + "\"\n输出:" + countDistinctIntegers(sample));
}
}
public static int countDistinctIntegers(String word) {
// 替换非数字字符为空格
String processed = word.replaceAll("[^0-9]", " ");
// 分割字符串
String[] numbers = processed.split("\\s+");
// 使用HashSet去重
Set<Integer> distinctIntegers = new HashSet<>();
for (String number : numbers) {
// 只有当字符串不为空时才转换为整数
if (!number.isEmpty()) {
distinctIntegers.add(Integer.parseInt(number));
}
}
// 返回不同整数的数目
return distinctIntegers.size();
}
}
总结
本题的解决方案涉及到字符串处理和集合的使用。通过正则表达式替换非数字字符为空格,我们可以将数字字符分隔开。然后,通过分割字符串和转换为整数,我们可以提取出所有的整数。使用HashSet存储整数是去重的关键,因为集合不允许重复元素。这种方法不仅代码简洁,而且效率较高,适用于处理包含大量数据的字符串。在实际应用中,这种方法可以扩展到更复杂的文本处理场景,如日志分析、数据清洗等。通过这种方式,我们可以有效地从复杂的数据中提取有用信息,并进行统计分析。