字符串出现次数的TopK问题

该博客介绍了一种使用HashMap和优先队列(PriorityQueue)在Java中实现统计字符串出现频率并返回出现最多的k个字符串的方法。通过创建一个自定义比较器,优先队列能够在保持小根堆性质的同时,考虑字符串的字典序。最终,将堆中的元素按频率和字典序排序后返回结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

import java.util.*;


public class Solution {
    /**
     * return topK string
     * @param strings string字符串一维数组 strings
     * @param k int整型 the k
     * @return string字符串二维数组
     */
     public String[][] topKstrings(String[] strings, int k) {
        //记录字符出现次数
        HashMap<String, Integer> map = new HashMap<>();
        for (int i = 0; i < strings.length; i++) {
            if (map.containsKey(strings[i])) {
                map.put(strings[i], map.get(strings[i]) + 1);
            } else {
                map.put(strings[i], 1);
            }
        }
        //建立小根堆,自定义比较器(次数值value相同,比较key的字典序,不相同直接比较次数值value)
        PriorityQueue<Map.Entry<String, Integer>> pq = new PriorityQueue<>(
                (o1, o2) -> o1.getValue().equals(o2.getValue()) ? o2.getKey().compareTo(o1.getKey()) : o1.getValue() - o2.getValue());
        //维护size为k的小根堆
        for (Map.Entry<String, Integer> m : map.entrySet()) {
            if (pq.size() < k) {
                pq.offer(m);
                //大于堆顶元素插入
            } else if ((m.getValue().equals(pq.peek().getValue()) ? pq.peek().getKey().compareTo(m.getKey()) : m.getValue() - pq.peek().getValue()) > 0) {
                pq.poll();
                pq.offer(m);
            }
        }
        //取出堆中元素,从后向前放置
        String[][] res = new String[k][2];
        for (int i = k - 1; i >= 0; i--) {
            Map.Entry<String, Integer> entry = (Map.Entry) pq.poll();
            res[i][0] = entry.getKey();
            res[i][1] = String.valueOf(entry.getValue());
        }
        return res;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值