AI刷题:不同整数的的计数问题 | 豆包MarsCode AI刷题

84 阅读3分钟

问题描述

小R有一个字符串 word,该字符串由数字和小写英文字母组成。小R想用空格替换每一个不是数字的字符。然后,他希望统计在替换后剩下的整数中,不同整数的数目。

例如,给定字符串 "a123bc34d8ef34",替换后形成的字符串是 " 123 34 8 34",剩下的整数是 "123""34""8""34"。不同的整数有三个,即 "123""34""8"

注意,只有当两个整数的不含前导零的十进制表示不同,才认为它们是不同的整数。


测试样例

样例1:

输入:word = "a123bc34d8ef34"
输出:3

样例2:

输入:word = "t1234c23456"
输出:2

样例3:

输入:word = "a1b01c001d4"
输出:2

通览全题,很明显我们的目的是将一个不规则串中的各部分整数提取出来,统计数目。

后者很明显,每得到一个数,存入hashset,直接调.size()方法就行。

至于前面的处理,“小R想用空格替换每一个不是数字的字符。”这句话暗示我们将不规则串规范化,为什么呢?为了调用 .split()方法,“ ”就是split方法的第二个参数。

s.split(s2) : 使用s2将字符串s拆开,返回的是一个字符串数组,原字符串不变(s2是一个正则表达式)

接下来我们要做的就是围绕着这个框架填充

第一步,调用MarsCode AI方法得到

好的,让我们来逐步解决这个问题。首先,我们需要理解题目的要求:

  1. 替换非数字字符:我们需要遍历字符串,将所有非数字字符替换为空格。
  2. 提取整数:在替换后的字符串中,提取出所有的整数。
  3. 去重并统计不同整数的数量:使用集合来存储不同的整数,最后返回集合的大小。

代码提示

  1. 替换非数字字符

    • 使用 StringBuilder 来构建新的字符串。
    • 遍历输入字符串,如果字符是数字,则添加到 StringBuilder 中;否则添加空格。
  2. 提取整数

    • 使用正则表达式或字符串分割来提取整数。
    • 注意处理前导零的情况。
  3. 去重并统计不同整数的数量

    • 使用 Set 来存储不同的整数。
    • 最后返回 Set 的大小。
public static int solution(String word) {
        // write code here
        StringBuilder sb = new StringBuilder();
        for(char c:word.toCharArray()){
            if(Character.isDigit(c)){
                sb.append(c);
            } else {
                sb.append(" ");
            }
        }
        String[] parts = sb.toString().split("\\s+");
        Set<String> uniqueIntegers = new HashSet<>();

        for (String part : parts) {
            if (!part.isEmpty()) {
                // Remove leading zeros
                part = part.replaceFirst("^0+(?!$)", "");
                uniqueIntegers.add(part);
            }
        }
        return uniqueIntegers.size();
    }

好,看来就单单这题来看,豆包的写代码能力非常优秀,已经不需要我们补充什么了。

事实上代码会报错,因为缺少Set和HashSet包,这点可以通过自动修复来解决