题目描述
给一非空的单词列表,返回前 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) 空间复杂度解决。
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/to… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
返回前k个高频词
- 首先创建hash表,以map类型创建,用于统计每个元素出现的次数
hash=new Map();
- 遍历参数数组,hash.set()查找每个元素假设为x,是否在hash表中,若不在则以x为键,出现次数为值保存在hash变量中,若已经存在则在原有次数上加 1。
3.为统计好的字符串们排序
- 把hash中所有的key放入数组list
let list=[]
for(let key of hash.keys()){
list.push(key)
};
- 再将该list进行sort排序,排序原则是hash中以list元素为key的值的大小。
list.sort((a,b)=>{
return hash.get(b)=== hash.get(a)?a.localeCompare(b):hash.get(b)- hash.get(a);
})
4.返回list前k个元素
代码
/**
* @param {string[]} words
* @param {number} k
* @return {string[]}
*/
var topKFrequent = function(words, k) {
let hash=new Map();
//存到hash表中,统计次数
for(let i=0;i<words.length;i++){
hash.set(words[i],(hash.get(words[i])||0)+1);
}
//遍历键名添加到数组
let list=[]
for(let key of hash.keys()){
list.push(key)
};
// 按降幂排序,注意频率相同的,按字母排序
list.sort((a,b)=>{
return hash.get(b)=== hash.get(a)?a.localeCompare(b):hash.get(b)- hash.get(a);
})
//返回前k个
return list.slice(0,k)
};