[路飞]_LeetCode_692. 前K个高频单词

103 阅读1分钟

题目

给一非空的单词列表,返回前 k 个出现次数最多的单词。

返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率,按字母顺序排序。

示例 1:

输入: ["i", "love", "leetcode", "i", "love", "coding"], k = 2
输出: ["i", "love"]
解析: "i""love" 为出现次数最多的两个单词,均为2次。
    注意,按字母顺序 "i""love" 之前。

来源:力扣(LeetCode)leetcode-cn.com/problems/to…

解题思路

  1. 这道题属于中级,难点在于排序,凡是计数的都可以用 Map
  2. 用 Map 计数后再通过一个关联的数组(数组中只包括去重后的单词)进行排序
  3. 最后返回排序后的数组的前 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)
};

如有错误欢迎指出,欢迎一起讨论!