携手创作,共同成长!这是我参与「掘金日新计划 · 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 <= 1000001 <= book[i].length <= 10get函数的调用次数不会超过100000
思路分析
方法一
- 在构造函数中把入参赋值给
this.book; - 在
get方法中寻找word在this.book中出现的次数; - 循环
this.book然后将等于word中的次数都累加到count中,返回count即可; - 执行完测试用例后,用时六千多毫秒,原因是因为在
get获取次数的时候,每次都在循环获取次数,因此我们还有改善的空间。
方法二
- 在经过方法一后,可以得知每次都循环耗时太久;
- 那么方法二中,我们在构造函数中就把每个字符串的次数统计出来;
- 在
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