如何基于基础方法实现字符串不重复单词数量统计?
用基础Java语法实现单词去重统计
现有代码仅能统计字符串中的总单词数量,无法排除重复单词。比如输入"A long long time ago, I can still remember"时,原代码返回9,但我们需要返回8(去掉重复的"long")。要求只能用基础语法(不能用哈希集合、哈希表等高级工具)实现去重统计。
原方法名mostCommonLetter和功能不符,修改后的方法名改为countUniqueWords更准确,核心思路是手动记录已出现的单词,每次识别出完整单词后,先检查是否已被统计过,仅未出现的单词计入总数。
修改后代码
public static int countUniqueWords(String s) { // 存储已出现的单词,按字符串长度估算数组大小(每个单词至少1字符,取长度一半足够容纳所有唯一单词) String[] seenWords = new String[s.length() / 2]; int uniqueCount = 0; boolean inWord = false; int wordStartIndex = 0; for (int i = 0; i <= s.length(); i++) { // 处理到字符串末尾,或遇到非字母字符时,提取当前单词 if (i == s.length() || !Character.isLetter(s.charAt(i))) { if (inWord) { // 提取单词并转小写,避免大小写差异导致的误判(比如"A"和"a"算同一个单词) String currentWord = s.substring(wordStartIndex, i).toLowerCase(); // 检查当前单词是否已在存储数组中 boolean isDuplicate = false; for (int j = 0; j < uniqueCount; j++) { if (seenWords[j].equals(currentWord)) { isDuplicate = true; break; } } // 非重复单词则计数并存入数组 if (!isDuplicate) { seenWords[uniqueCount] = currentWord; uniqueCount++; } inWord = false; } } else { // 标记进入单词状态,记录单词起始索引 if (!inWord) { inWord = true; wordStartIndex = i; } } } return uniqueCount; }
关键逻辑说明
- 单词提取:通过判断字母/非字母的边界分割单词,同时统一转小写,避免大小写不同被误判为不同单词
- 重复检查:用字符串数组存储已统计的单词,每次新单词生成后,遍历数组逐一比对,确认无重复才计数
- 数组容量:根据原字符串长度估算数组大小,基础语法下固定长度数组足以应对大部分场景
测试示例:调用countUniqueWords("A long long time ago, I can still remember"),返回结果为8,符合预期。
内容的提问来源于stack exchange,提问作者gaming With HENEy
相关产品推荐
相关产品推荐

