问题描述
小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,直接调.size()方法就行。
至于前面的处理,“小R想用空格替换每一个不是数字的字符。”这句话暗示我们将不规则串规范化,为什么呢?为了调用 .split()方法,“ ”就是split方法的第二个参数。
s.split(s2) : 使用s2将字符串s拆开,返回的是一个字符串数组,原字符串不变(s2是一个正则表达式)
接下来我们要做的就是围绕着这个框架填充
第一步,调用MarsCode AI方法得到
好的,让我们来逐步解决这个问题。首先,我们需要理解题目的要求:
- 替换非数字字符:我们需要遍历字符串,将所有非数字字符替换为空格。
- 提取整数:在替换后的字符串中,提取出所有的整数。
- 去重并统计不同整数的数量:使用集合来存储不同的整数,最后返回集合的大小。
代码提示
-
替换非数字字符:
- 使用
StringBuilder来构建新的字符串。 - 遍历输入字符串,如果字符是数字,则添加到
StringBuilder中;否则添加空格。
- 使用
-
提取整数:
- 使用正则表达式或字符串分割来提取整数。
- 注意处理前导零的情况。
-
去重并统计不同整数的数量:
- 使用
Set来存储不同的整数。 - 最后返回
Set的大小。
- 使用
public static int solution(String word) {
// write code here
StringBuilder sb = new StringBuilder();
for(char c:word.toCharArray()){
if(Character.isDigit(c)){
sb.append(c);
} else {
sb.append(" ");
}
}
String[] parts = sb.toString().split("\\s+");
Set<String> uniqueIntegers = new HashSet<>();
for (String part : parts) {
if (!part.isEmpty()) {
// Remove leading zeros
part = part.replaceFirst("^0+(?!$)", "");
uniqueIntegers.add(part);
}
}
return uniqueIntegers.size();
}
好,看来就单单这题来看,豆包的写代码能力非常优秀,已经不需要我们补充什么了。
事实上代码会报错,因为缺少Set和HashSet包,这点可以通过自动修复来解决