传入字符串重复字符统计JS实现报错:Codewars题解答
Codewars平台编程题需求
我在Codewars刷题时遇到一道题,要求识别传入字符串中的相同字符,返回字符串中出现次数达到两次及以上的字符。我自己写了实现代码,运行后直接抛错,由于编程经验尚浅,找不出问题出在哪,也不知道怎么调整才能符合题目要求。
我写的原始代码
function duplicateCount(text){ text.split('') for(var i = 0, i < text.length, i++) { for(var j = 1, j < text.length + 1, j++) if(text[j] = text[i]) { return text[i] } else return } //... }
代码的具体错误点
text.split('')这行完全没生效:split方法不会修改原字符串,执行完必须把返回的数组存下来才能用,当前写法调用完啥也不存,等于白写- for循环语法写错了:JS的for循环三个部分(初始化、循环判断、步长更新)之间必须用分号分隔,你现在全用逗号连起来,语法层面就不成立,运行环境直接抛语法错误,根本进不了循环逻辑
- 内层循环的边界写歪了:j从1开始遍历,判断条件还写的
j < text.length + 1,既会读到字符串范围外的undefined值做比较,也会漏掉需要遍历的有效字符位置 - 相等判断写成了赋值:if里的判断条件用了单等号
text[j] = text[i],这行代码不是在判断两个位置的字符是否相等,是直接把text[i]的值赋值给text[j],既篡改了原字符串,也永远不可能触发我们想要的相等判断逻辑,要做相等判断得用===或者== - 循环逻辑完全不对:你现在的代码是,只要第一次内层循环没匹配上,就直接走else分支return退出了,根本不会遍历剩下的位置;就算真的匹配上重复字符,也是直接返回单个字符就退出,既收集不全所有重复字符,也从头到尾没有统计字符出现次数的逻辑
- 缺了必要的边界兼容:没有统一字符的大小写(这道题原题是不区分大小写的,比如'A'和'a'要算同一个重复字符),也没有对重复字符去重,就算跑通了也拿不到正确结果
能正常通过测试的修正版本
function duplicateCount(text){ // 全转小写,不区分大小写统计 const normalizedText = text.toLowerCase(); // 用对象存每个字符的出现次数 const charCount = {}; for (const char of normalizedText) { charCount[char] = (charCount[char] || 0) + 1; } // 筛选出出现次数≥2的字符,返回对应数量(符合原题的返回值要求) return Object.values(charCount).filter(count => count >= 2).length; }
内容的提问来源于stack exchange,提问作者CodingTrapper
相关产品推荐
相关产品推荐

