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

一.题目描述

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

    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

允歆辰丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值