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