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

116 阅读4分钟

整体功能概述

这段 Java 代码主要实现了一个功能,即对于给定的由数字和小写英文字母组成的字符串 word,先将其中非数字的字符替换为空格,然后从处理后的字符串中提取出所有的整数部分,去除这些整数的前导零,并统计出不同整数的数目。例如,对于输入字符串 "a123bc34d8ef34",经过处理后能正确统计出不同整数的个数为 3(分别是 "123""34" 和 "8"),同时对于像输入 "m" 这种全是非数字字符的情况,能准确返回 0,表示不存在不同的整数。

代码结构与各部分详解

  1. solution 方法主体逻辑

    • 替换非数字字符为空格
String replacedWord = word.replaceAll("[^0-9]", " ");

这行代码使用了 replaceAll 方法,它基于正则表达式 [^0-9],这个正则表达式表示匹配所有不是数字的字符,然后将这些字符统一替换为空格,从而得到一个新的字符串 replacedWord,完成了对输入字符串的初步处理,使其只包含数字和空格。

  • 去除两端多余空格并判断是否为空字符串
replacedWord = replacedWord.trim();
if (replacedWord.isEmpty()) {
    return 0;
}

trim 方法用于去除字符串两端可能存在的多余空格,确保后续操作的字符串格式更规范。紧接着通过 isEmpty 方法判断处理后的 replacedWord 是否为空字符串,如果为空,那就意味着原输入字符串 word 全是非数字字符,按照题目要求,这种情况下直接返回 0,表示不存在不同的整数,从最开始就阻断了不必要的后续操作,避免出现错误判断。

  • 分割字符串获取数字字符串数组
String[] numStrs = replacedWord.split(" ");

这里使用 split 方法按照空格对处理后的字符串进行分割,将其拆分成一个个的子字符串,这些子字符串理论上就是我们要提取的整数部分,最终得到的 numStrs 数组存储了这些可能的整数字符串。需要注意的是,split 方法在遇到连续多个空格时会产生空字符串元素,后续代码会对这种情况进行处理。

  • 遍历数字字符串数组进行处理并统计不同整数个数
Set<String> distinctNums = new HashSet<>();
for (String numStr : numStrs) {
    // 跳过空字符串(可能是连续空格分割出来的空元素情况)
    if (numStr.isEmpty()) {
        continue;
    }
    // 处理可能的负数情况,确保数字完整性
    if (numStr.startsWith("-")) {
        numStr = numStr.substring(1);
    }
    // 去除前导零
    String trimmedNum = numStr.replaceFirst("^0*", "");
    if (trimmedNum.isEmpty()) {
        // 如果去除前导零后为空字符串,说明原数字就是0,将其设为"0"
        trimmedNum = "0";
    }
    distinctNums.add(trimmedNum);
}
return distinctNums.size();

首先创建了一个 HashSet 类型的集合 distinctNums,利用 HashSet 的元素唯一性特点来帮助我们统计不同整数的个数。然后通过 for-each 循环遍历 numStrs 数组中的每个字符串元素。

  • 在循环内部,先通过 if (numStr.isEmpty()) 判断当前字符串是否为空,如果为空(可能是之前提到的连续空格分割导致的空元素情况),就使用 continue 语句跳过本次循环,不进行后续处理,直接进入下一次循环去检查下一个元素。

  • 接着处理负数情况,如果字符串是以 - 开头,意味着这可能是一个负数表示,通过 substring 方法截取出从索引 1 开始往后的字符串,也就是去掉负号,得到纯数字部分,确保后续对数字的处理(如去除前导零等操作)是针对真正的数字内容进行的。

  • 再使用 replaceFirst 方法结合正则表达式 ^0*(表示匹配字符串开头连续的 0)去除数字字符串的前导零,得到处理后的数字字符串 trimmedNum。若去除前导零后 trimmedNum 为空字符串,按照逻辑说明原数字就是 0,所以将其赋值为 "0"

  • 最后把处理好的数字字符串 trimmedNum 添加到 distinctNums 集合中,利用集合的去重特性,自动过滤掉重复的整数表示。循环结束后,通过返回 distinctNums 集合的大小 distinctNums.size(),就得到了不同整数的数目,完成了整个统计功能。