LeetCode 算法:单词频率

129 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第 17 天,点击查看活动详情

单词频率

原题地址

设计一个方法,找出任意指定单词在一本书中的出现频率。

你的实现应该支持如下操作:

  • WordsFrequency(book)构造函数,参数为字符串数组构成的一本书
  • get(word)查询指定单词在书中出现的频率

示例:

WordsFrequency wordsFrequency = new WordsFrequency({"i", "have", "an", "apple", "he", "have", "a", "pen"});
wordsFrequency.get("you"); //返回0,"you"没有出现过
wordsFrequency.get("have"); //返回2,"have"出现2次
wordsFrequency.get("an"); //返回1
wordsFrequency.get("apple"); //返回1
wordsFrequency.get("pen"); //返回1

提示:

  • book[i] 中只包含小写字母
  • 1 <= book.length <= 100000
  • 1 <= book[i].length <= 10
  • get 函数的调用次数不会超过 100000

思路分析

方法一

  1. 在构造函数中把入参赋值给 this.book
  2. get 方法中寻找 wordthis.book 中出现的次数;
  3. 循环 this.book 然后将等于 word 中的次数都累加到 count 中,返回 count 即可;
  4. 执行完测试用例后,用时六千多毫秒,原因是因为在 get 获取次数的时候,每次都在循环获取次数,因此我们还有改善的空间。

方法二

  1. 在经过方法一后,可以得知每次都循环耗时太久;
  2. 那么方法二中,我们在构造函数中就把每个字符串的次数统计出来;
  3. get 方法时,直接取对应的字符串的 key 对的 value 值即可,若没有值,则返回 0

AC 代码

方法一

/**
 * @param {string[]} book
 */
var WordsFrequency = function(book) {
    this.book = book
};

/** 
 * @param {string} word
 * @return {number}
 */
WordsFrequency.prototype.get = function(word) {
    let count = 0
    for(let i = 0; i < this.book.length; i++) {
        if(word === this.book[i]) {
            count += 1
        }
    }
    return count
};

/**
 * Your WordsFrequency object will be instantiated and called as such:
 * var obj = new WordsFrequency(book)
 * var param_1 = obj.get(word)
 */

结果:

  • 执行结果: 通过
  • 执行用时:6632 ms, 在所有 JavaScript 提交中击败了8.49%的用户
  • 内存消耗:76 MB, 在所有 JavaScript 提交中击败了12.26%的用户
  • 通过测试用例:24 / 24

方法二

/**
 * @param {string[]} book
 */
var WordsFrequency = function(book) {
    const res = {}
    for(let i = 0; i < book.length; i++) {
        if(res[book[i]]) {
            res[book[i]] += 1
        } else {
            res[book[i]] = 1
        }
    }
    this.book = res
};

/** 
 * @param {string} word
 * @return {number}
 */
WordsFrequency.prototype.get = function(word) {
    return this.book[word] || 0
};

/**
 * Your WordsFrequency object will be instantiated and called as such:
 * var obj = new WordsFrequency(book)
 * var param_1 = obj.get(word)
 */

结果:

  • 执行结果: 通过
  • 执行用时:336 ms, 在所有 JavaScript 提交中击败了68.87%的用户
  • 内存消耗:74.5 MB, 在所有 JavaScript 提交中击败了44.34%的用户
  • 通过测试用例:24 / 24

END