LeetCode 每日一题——1805. 字符串中不同整数的数目

105 阅读2分钟

1.题目描述

1805. 字符串中不同整数的数目

给你一个字符串 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 测试结果

通过测试

image.png

3.总结

  • 使用 StringBuilder 拼接数字并用 HashSet 暂存获取到的数字
  • 当 StringBuilder 长度为 1 并且该位是 0 时直接删除该位的 0,这样可以处理掉前导零