一.题目描述
给你一个字符串 word
,该字符串由数字和小写英文字母组成。
请你用空格替换每个不是数字的字符。例如,"a123bc34d8ef34"
将会变成 " 123 34 8 34"
。注意,剩下的这些整数为(相邻彼此至少有一个空格隔开):"123"
、"34"
、"8"
和 "34"
。
返回对 word
完成替换后形成的 不同 整数的数目。
只有当两个整数的 不含前导零 的十进制表示不同, 才认为这两个整数也不同。
注意:1.相同的数值只添加一次,2.前导0要去除:不如:001a001,相当于只含有一个1;
二.问题分析
1.双指针的使用
我们先考虑到这个题目可以设置两个指针.start和end,刚开始start可以指向第一个数字字符开始的位置,然后end指向数字字符结束,字母字符开始的位置
2.去重的考虑
首先,相同数值的只添加一次,这个时候我们可以用Java中的HashSet,这样可以自动帮我们去重,并且HashSet的泛型必须是String,因为这是一个字符串,可能超过int的最大值造成溢出.
3.去除前导0的考虑
确定了容器之后我们就该考虑如何去除前导0了,当start找到第一个数字字符,end找到数字字符末尾,这个时候可以判断end-start是否大于1,因为存在end-start==1时为0的情况,end-start>1时,这个时候可以判断start下标对应的值是否为0,如果为零,就让start后移,知道start对应的值不为0为止,这样就可以去除前导0的存在
三.代码实现
public int numDifferentIntegers(String word) {
HashSet<String> set = new HashSet<>();
int start = 0, end = 0;
//左开右闭
while (end < word.length()) {
while (start < word.length() && !Character.isDigit(word.charAt(start))) {
start++;
}
if (start == word.length())
break;
end = start;
while (end < word.length() && Character.isDigit(word.charAt(end))) {
end++;
}
while (start + 1 < end && word.charAt(start) == '0') {
start++;
}
set.add(word.substring(start, end));
start=end;
}
return set.size();
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/101061.html