题目
给一非空的单词列表,返回前 k 个出现次数最多的单词。
返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率,按字母顺序排序。
示例 1:
输入: ["i", "love", "leetcode", "i", "love", "coding"], k = 2
输出: ["i", "love"]
解析: "i" 和 "love" 为出现次数最多的两个单词,均为2次。
注意,按字母顺序 "i" 在 "love" 之前。
来源:力扣(LeetCode)leetcode-cn.com/problems/to…
解题思路
- 这道题属于中级,难点在于排序,凡是计数的都可以用 Map
- 用 Map 计数后再通过一个关联的数组(数组中只包括去重后的单词)进行排序
- 最后返回排序后的数组的前 k 个单词
代码实现
var topKFrequent = function(words, k) {
const map = new Map()
const ans = []
words.forEach(word => {
if (!map.has(word)) {
map.set(word, 0)
ans.push(word)
}
map.set(word, map.get(word) + 1)
})
ans.sort((a, b) => {
//单词按数量倒序,数量一样时按字母排序
return map.get(a) === map.get(b) ? a.localeCompare(b) : map.get(b) - map.get(a)
})
return ans.slice(0, k)
};
如有错误欢迎指出,欢迎一起讨论!