帮甘露寺找前k个高频单词

这篇博客介绍了一种使用Java解决寻找字符串数组中出现频率最高的k个单词的方法。首先,通过HashMap统计单词频率并去重,然后利用自定义比较器创建小根堆,堆中元素按频率降序、相同频率时按字典序升序排列。最终,从堆中弹出k个元素得到结果,并反转顺序。博客还包含完整的Java代码示例。
摘要由CSDN通过智能技术生成

                                                         

                                                           

                              大家好,我是爱动漫更爱编程的小工同学~

                                                            

 全文目录

       🎁题目分析

      💡思路点拨

     🏆参考代码

     🚀每日一图

 🎁题目分析

 今天来一到Top_K问题,这一类问题应该算是面试中比较常见,所以有大厂梦的同学们,速速来看。

首先我们来解解题:1、要返回前k个次数最多的单词。

                                2、答案还得按单词出现频率降序排列。

                                3、 不同单词如果出现评率相同,还得按字典序排序

                           感谢出题人,一次性想让我们学会这么多知识点

然后我们来想想对策:1、单词和出现评论的绑定起来,所以一个Map是跑不掉的。

                                    2、前k个,那肯定得构建小跟堆,因为默认的比较器都是升序的。

                                    3、处理字典序的问题。

💡思路点拨

我一直信奉敲代码就跟解方程一样,紧密连续,有理有据,通顺流畅。

首先我们建立一个HashMap来统计每个字符以及每个字符出现的频率,顺便去个重。

然后构建自定义比较器,把单词的字典序升序排列,出现频率降序排列,一石二鸟。

这里单独列一下比较器的代码

PriorityQueue<String> minHeap = new PriorityQueue<>(new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        if (count.get(s1).equals(count.get(s2))) {
            return s2.compareTo(s1);
        } else {
            return count.get(s1) - count.get(s2);
        }
    }
});

最后因为是小跟堆,所以最后反转一下集合即可。

🏆参考代码(Java版)

public class Solution {

     public List<String> topKFrequent(String[] words, int k) {
        // 1.先用哈希表统计单词以及出现的频率
        Map<String, Integer> count = new HashMap();
        for (String word : words) {
            count.put(word, count.getOrDefault(word, 0) + 1);
        }
        // 2.构建小根堆 这里需要自己构建比较规则 频率相同单词按字典序升序,频率降序排列
        PriorityQueue<String> minHeap = new PriorityQueue<>((s1, s2) -> {
            if (count.get(s1).equals(count.get(s2))) {
                return s2.compareTo(s1);
            } else {
                return count.get(s1) - count.get(s2);
            }
        });
        // 3.依次向堆加入元素。
        for (String s : count.keySet()) {
            minHeap.offer(s);
            // 当堆中元素个数大于 k 个的时候,需要弹出堆顶最小的元素。
            if (minHeap.size() > k) {
                minHeap.poll();
            }
        }
        // 4.依次弹出堆中的 K 个元素,放入结果集合中。
        List<String> res = new ArrayList<String>(k);
        while (minHeap.size() > 0) {
            res.add(minHeap.poll());
        }
        // 5.注意最后需要反转元素的顺序。
        Collections.reverse(res);
        return res;
    }        
}

   🚀每日一图

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值