给一非空的单词列表,返回前 k 个出现次数最多的单词。
返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率,按字母顺序排序。
示例 1:
输入: ["i", "love", "leetcode", "i", "love", "coding"], k = 2 输出: ["i", "love"] 解析: "i" 和 "love" 为出现次数最多的两个单词,均为2次。
注意,按字母顺序 "i" 在 "love" 之前
首先最简单的方法就是遍历,然后把相同的进行累加,这样就把前N个拿出来就可以了
/**
* @param {string[]} words
* @param {number} k
* @return {string[]}
*/
var topKFrequent = function(words, k) {
/*
哈希表 + 排序算法 O(N*logM)
*/
if (!words.length) return []
const map = Object.create(null)
words.forEach(word => map[word] ? map[word]++ : (map[word] = 1))
/*
map[b] - map[a] || a.localeCompare(b) 等价于
if (map[b] - map[a] !== 0) map[b] - map[a] 当二次频次不一样时 按照频次降序排列
else a.localeCompare(b) 当二者频次一样时 比较单词大小
String.prototype.localeCompare 返回一个数字来指示一个参考字符串是否在排序顺序前面或之后或与给定字符串相同
*/
return Object.keys(map).sort((a, b) => map[b] - map[a] || a.localeCompare(b) ).slice(0, k)
};