1.题目描述
给你一个字符串 word ,该字符串由数字和小写英文字母组成。
请你用空格替换每个不是数字的字符。例如,"a123bc34d8ef34" 将会变成 " 123 34 8 34" 。注意,剩下的这些整数为(相邻彼此至少有一个空格隔开):"123"、"34"、"8" 和 "34" 。
返回对 word 完成替换后形成的 不同 整数的数目。
只有当两个整数的 不含前导零 的十进制表示不同, 才认为这两个整数也不同。
示例 1:
输入:word = "a123bc34d8ef34"
输出:3
解释:不同的整数有 "123"、"34" 和 "8" 。注意,"34" 只计数一次。
示例 2:
输入:word = "leet1234code234"
输出:2
示例 3:
输入:word = "a1b01c001"
输出:1
解释:"1"、"01" 和 "001" 视为同一个整数的十进制表示,因为在比较十进制值时会忽略前导零的存在。
2.解题思路与代码
2.1 解题思路
遍历字符串,判断字符是否为数字,如果是数字则放进一个 StringBuilder 对象中做暂存;如果不是数字并且 StringBuilder 对象长度大于 1,则将 StringBuilder 对象转成 String 对象放入一个 HashSet 中。最后返回 HashSet 长度便是字符串中的不同数字个数。这里就有几种特殊情况需要判断,由于需要去除数字前面的 0 ,并且只有 0 的时候也算一个数字,所以在遍历到数字时还需要判断 StringBuilder 对象的长度是否为 1 并且第 1 位是否为 0,如果长度是 1 并且第一位是 0 的话,就将 StringBuilder 的第一位 0 给删除了,然后将 word.charAt(i) 字符放入 StringBuilder 对象中,这样就能够将数字前面的 0 给进行过滤,并保留只有 0 的情况。
2.2 代码
class Solution {
public int numDifferentIntegers(String word) {
StringBuilder builder = new StringBuilder();
Set<String> set = new HashSet<>();
for (int i = 0; i < word.length(); i++) {
if (isNum(word.charAt(i))) {
if (builder.length() == 1 && builder.charAt(0) == '0') {
builder.deleteCharAt(0);
}
builder.append(word.charAt(i));
} else {
if (builder.length() > 0) {
set.add(builder.toString());
builder = new StringBuilder();
}
}
}
if (builder.length() > 0) {
set.add(builder.toString());
}
return set.size();
}
public boolean isNum(char c) {
return c == '0' || c == '1' || c == '2' || c == '3' || c == '4' || c == '5' || c == '6' || c == '7' || c == '8' || c == '9';
}
}
2.3 测试结果
通过测试
3.总结
- 使用 StringBuilder 拼接数字并用 HashSet 暂存获取到的数字
- 当 StringBuilder 长度为 1 并且该位是 0 时直接删除该位的 0,这样可以处理掉前导零