题目描述
给一非空的单词列表,返回前 k 个出现次数最多的单词。
返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率,按字母顺序排序。
示例 1:
输入: ["i", "love", "leetcode", "i", "love", "coding"], k = 2
输出: ["i", "love"]
解析: "i" 和 "love" 为出现次数最多的两个单词,均为2次。
注意,按字母顺序 "i" 在 "love" 之前。
示例 2:
输入: ["the", "day", "is", "sunny", "the", "the", "the", "sunny", "is", "is"], k = 4
输出: ["the", "is", "sunny", "day"]
解析: "the", "is", "sunny" 和 "day" 是出现次数最多的四个单词,
出现次数依次为 4, 3, 2 和 1 次。
注意:
- 假定 k 总为有效值, 1 ≤ k ≤ 集合元素数。
- 输入的单词均由小写字母组成。
扩展练习:
- 尝试以 O(n log k) 时间复杂度和 O(n) 空间复杂度解决。
分析
本文最简单直接的方式就是统计出现的单词及其出现的次数,然后将每一个元素按照出现次数从大到小排序,如果出现次数相同,则根据字母顺序排序
最后获取降序排序后的数组的前 k 个单词即可
代码如下:
var topKFrequent = function(words, k) {
// 通过map记录出现过的单词及其出现次数
const map = new Map();
for(let i = 0;i<words.length;i++){
const item = words[i];
if(map.has(item)){
map.set(item,map.get(item)+1)
}else{
map.set(item,1)
}
}
// 将每一组单词及次数存入数组
const arr = [];
map.forEach((val,name) => {
arr.push({name,val})
})
// 对数组排序
arr.sort((a,b) => {
if(a.val===b.val) return a.name<b.name?-1:1
else return b.val-a.val
})
// 获取排序后的前k个单词
const res = [];
for(let i = 0;i<arr.length;i++){
if(res.length<k) res.push(arr[i].name)
else break;
}
return res;
};
至此我们就完成了leetcode-692-前K个高频单词