Leetcode1805:字符串中不同整数的数目

导读:本篇文章讲解 Leetcode1805:字符串中不同整数的数目,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

一.题目描述

给你一个字符串 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

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!