JavaScript多并列高频单词查找功能实现求助
解决捕获所有并列最高频单词的问题
嘿,我来帮你搞定这个问题!你的代码确实在处理多个高频单词的时候逻辑绕了弯路,而且效率也有点低,咱们来一步步分析并修正它。
原代码的问题分析
你的思路方向是对的,但几个环节的处理导致无法正确捕获所有并列高频单词:
- 效率冗余:在
forEach里每次调用filter统计单个单词的次数,相当于对整个数组做了n次遍历(n是单词总数),时间复杂度是O(n²),字符串越长越慢。 - 逻辑混乱:处理
maxWord时反复拼接字符串、转数组、用Set去重,不仅容易出错,还会因为同一个单词被多次遍历到(比如示例里的she)而重复执行去重操作,逻辑非常冗余。 - 初始值隐患:
maxWord初始为空字符串,当第一个高频单词出现后,后续添加并列单词时的拼接逻辑很容易引入不必要的空格或重复值。
简单可行的解决方案
我们换一种更清晰高效的思路:先一次性统计所有单词的出现次数,再找出最大次数,最后收集所有达到这个次数的单词。这样既避免了冗余操作,也能准确获取所有并列高频单词。
改进后的代码
let str = "She she sells sea shells down by the sea shore boop seasalt"; function commonWords() { if (str.length === 0) { return null; } // 统一转小写并分割为单词数组 const words = str.toLowerCase().split(" "); // 统计每个单词的出现次数(用对象存储,键是单词,值是次数) const wordCounts = {}; words.forEach(word => { // 如果单词已存在则次数+1,否则初始化为1 wordCounts[word] = (wordCounts[word] || 0) + 1; }); // 找出所有单词中的最高出现次数 const maxCount = Math.max(...Object.values(wordCounts)); // 筛选出所有出现次数等于最高次数的单词 const maxWords = Object.keys(wordCounts).filter(word => wordCounts[word] === maxCount); console.log(maxWords); // 输出: ["she", "sea"] return maxWords; } commonWords();
代码说明
- 统计次数:只用一次遍历就完成所有单词的计数,时间复杂度降到O(n),效率大幅提升。
- 获取最大次数:利用
Math.max结合对象的values方法,快速找到最高出现次数。 - 筛选高频单词:通过
filter方法从统计结果中挑出所有次数等于最大值的单词,直接得到完整的并列高频单词列表,完全不需要用Set去重——因为每个单词在统计结果里只出现一次。
测试结果
运行这段代码,针对你提供的示例字符串,会输出["she", "sea"],这两个单词都出现了2次,是文本中使用次数最多的单词,完全符合需求。
内容的提问来源于stack exchange,提问作者Chase Miller
相关产品推荐
相关产品推荐

