获取单词中重复次数最多的字母

4

我正在尝试获取单词中重复次数最多的字母计数

function GreatestCount(str)
{
    var count = {}

    for (var i = 0 ; i<str.length;i++)
    {
        var char = str[i];
        count[char] = (count[char] || 0) + 1;

    }

     //get the largest number for the letter counts
    var max = 0;

    for (var c in count) {
        if (count[c] > max) max = count[c];
    }

    return max
}

有人可以解释一下为什么吗?

count[char] = (count[char] || 0) + 1;// this works

count[char] += 1 // this does not work 

@Oriol已经回答了你的问题,但我想再帮你一点。在插入对象时,您可以存储最大值,这将减少最后一个“for”循环,节省26个循环。此外,您需要使用.ToLowerCase来防止在不同计数器中计算相同的字母。例如,除非您这样做,否则'a'和'A'将有所不同。 - Ori Refael
5个回答

7

由于

count[char] += 1

等于

count[char] = count[char] + 1

当代码首次运行时,count[char]undefined,因此与以下代码几乎相同:

undefined + 1 // which is NaN

工作版本通过使用 || 运算符并安全地添加 0 来避免这种情况。

5

初始时,count 是一个空对象,因此它没有 char 属性。因此,count[char] 返回 undefined

undefined + 1 会产生 NaN

因此,必须将其初始化为 0,以使其正常工作。

†: count 并不是一个完全空的对象,因为它继承了来自 Object.prototype 的属性。如果在那里定义了一个 char 属性,那么就会出现问题。 我建议使用 count = Object.create(null) 来代替。


1
我认为这个问题已经得到了回答。 - Ori Refael

3

在增加计数器之前,您需要将count[char]初始化为零。


2

第一次出现时,count[char]未定义,undefined += 1 !== 1


0
正如其他人所说,你的变量在开始时没有初始化,因此 count[char] +=1 不起作用,但是当你使用 (count[char] || 0) 时,实际上是告诉它们如果变量为“false”,则将其设置为0。False 可能意味着未定义、NaN 或0。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接