为何嵌套循环仅能检测到字符串中的部分重复字符?
问题分析与代码修正
你的代码有两个关键问题导致无法得到预期结果:
内层循环的范围完全错误
j < text[i].length这行逻辑根本不对——text[i]是字符串里的单个字符,它的长度永远是1,所以内层循环只会跑j=0这一次。这就导致只有前两个'a'能被检测到:i=0时j=0匹配自身,加一次'a';i=1时j=0匹配到'a',再加一次'a';后面的'b'根本没机会被完整比较,自然出现在结果里。无效的自身比较
原逻辑里j从0开始,会把当前字符和自己(i=j的时候)做对比,这属于无意义的重复检测,还会多添加一次当前字符。
两种修正方案
如果你的需求是把原字符串中所有出现次数超过1的字符,按出现次数全部收集到结果数组(比如"aabbcde"返回['a','a','b','b']),可以用下面两种方式实现:
方案一:修正嵌套循环逻辑
调整循环范围,同时标记已处理的字符避免重复统计:
const myStr = "aabbcde"; function duplicateCount(text){ const duplicates = []; const processed = new Array(text.length).fill(false); // 标记已处理的位置 for (let i = 0; i < text.length; i++) { if (processed[i]) continue; // 跳过已经处理过的字符 let charCount = 0; // 统计当前字符的总出现次数 for (let j = i; j < text.length; j++) { if (text[i] === text[j]) { charCount++; processed[j] = true; // 标记该位置已处理 } } // 出现次数>1的话,按次数添加到结果 if (charCount > 1) { duplicates.push(...Array(charCount).fill(text[i])); } } return duplicates; } console.log(duplicateCount(myStr)); // 输出: ['a','a','b','b']
方案二:先统计字符出现次数(更高效)
先遍历一次字符串统计每个字符的出现次数,再生成结果,时间复杂度更低(O(n) vs 嵌套循环的O(n²)):
const myStr = "aabbcde"; function duplicateCount(text){ const countMap = {}; // 第一步:统计每个字符出现的次数 for (const char of text) { countMap[char] = (countMap[char] || 0) + 1; } const duplicates = []; // 第二步:把出现次数>1的字符按次数加入结果 for (const [char, count] of Object.entries(countMap)) { if (count > 1) { duplicates.push(...Array(count).fill(char)); } } return duplicates; } console.log(duplicateCount(myStr)); // 输出: ['a','a','b','b']
内容的提问来源于stack exchange,提问作者Jack Averill
相关产品推荐
相关产品推荐

