leetcode-692
输入: words = [“i”, “love”, “leetcode”, “i”, “love”, “coding”], k = 2
输出: [“i”, “love”]
解析: “i” 和 “love” 为出现次数最多的两个单词,均为2次。
注意,按字母顺序 “i” 在 “love” 之前。
输入: words = [“i”, “love”, “leetcode”, “i”, “love”, “coding”], k = 3
输出: [“i”, “love”,“coding”]
解析: “i” 和 “love” 为出现次数最多的两个单词,均为2次。而"coding"和"leetcode"均为一次,按照字母序,保留前者,故得此结果。
解题思路:
利用map,一遍浏览过去,记录下每个单词出现的次数,形成键值对,接下来,提取出键名数组map.keys(),根据值的大小排序键名数组,取出前k个。
注意这里最后是要求按字母序,而非按出现的先后,故需要在一开始就用sort排一下。
- 核心代码:
let ele=Array.from(map.keys());//键名,接下来对键名按值排序
ele.sort(function(a,b){
//这里的ab都是键名
let a1=map.get(a),b1=map.get(b);
return b1-a1;//从大到小
})
- 完整代码:
var topKFrequent = function(words, k) {
let map=new Map();
words.sort();//先按字母序排好
for(let i in words){
if(map.has(words[i])){
map.set(words[i],map.get(words[i])+1);
}else{
map.set(words[i],1);
}
}
let ele=Array.from(map.keys());//键名,接下来对键名按值排序
ele.sort(function(a,b){
let a1=map.get(a),b1=map.get(b);
return b1-a1;//从大到小
})
let res=ele.splice(0,k);
return res;
};