[路飞]_算法_前K个高频单词——hash表

173 阅读2分钟

题目描述

给一非空的单词列表,返回前 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, 21 次。

 

注意:

  • 假定 k 总为有效值, 1 ≤ k ≤ 集合元素数。
  • 输入的单词均由小写字母组成。  

扩展练习:

  • 尝试以 O(n log k) 时间复杂度和 O(n) 空间复杂度解决。

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/to… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

返回前k个高频词

  1. 首先创建hash表,以map类型创建,用于统计每个元素出现的次数
hash=new Map();
  1. 遍历参数数组,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)

};