You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript解LeetCode最常见单词题时对象属性无法赋值问题

问题根因

你的map始终为空,本质是内层循环的相等判断从来没有成立过,从来没执行过给map赋值的逻辑,几个bug叠在一起导致的:

  • 最直接的原因:你直接按空格拆分段落,没有处理单词后面附带的标点。你打印unbannedwords的时候肉眼看着有两个ball,以为能匹配上,实际上第一个ball后面带逗号,值是'ball,',第二个才是纯单词'ball',两个字符串用===判断永远不相等,根本进不了if分支写map,最后打印出来自然是空对象。
  • 禁用词过滤逻辑写死了只判断banned[0]:一方面题目里banned可能传入多个禁用词,另一方面带标点的禁用词比如示例末尾的'hit.'根本不会被过滤掉。
  • 词频统计逻辑本身有问题:两层循环j从i+1开始计数,就算单词能匹配上,统计的次数也会少算当前i位置的1次,而且相同单词如果出现在i的前面,根本统计不到。
  • 还有个隐藏坑:你代码里的count变量没有用let/const声明,直接赋值会泄漏成全局变量,很容易引发莫名其妙的逻辑错误。
修正方案

不用写复杂的嵌套循环,按下面的逻辑走即可:

  1. 先把段落里所有非英文字母的字符全部替换成空格,统一转小写之后再按空白符拆分,过滤掉拆分出来的空字符串,就能拿到不带任何标点的纯单词数组。
  2. 把禁用词数组转成Set结构,判断单词是否禁用时直接查Set,效率高还不会漏判。
  3. 单次遍历单词数组,用对象记录每个非禁用词的出现次数,遍历过程中直接记录出现次数最高的单词即可,不用最后再遍历对象找最大值。

修正后的可运行代码:

var mostCommonWord = function(paragraph, banned) {
    // 清洗文本,拿到纯小写单词数组
    const words = paragraph
        .toLowerCase()
        .replace(/[^a-z]/g, ' ')
        .split(/\s+/)
        .filter(Boolean);
    const bannedSet = new Set(banned);
    const freq = {};
    let maxCount = 0;
    let result = '';

    for (const word of words) {
        if (bannedSet.has(word)) continue;
        freq[word] = (freq[word] || 0) + 1;
        if (freq[word] > maxCount) {
            maxCount = freq[word];
            result = word;
        }
    }

    return result;
};

内容的提问来源于stack exchange,提问作者Harsh Mishra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 16:24:30