• 字符串出现次数的TopK问题


     

    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 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> pq = new PriorityQueue<>(
                    (o1, o2) -> o1.getValue().equals(o2.getValue()) ? o2.getKey().compareTo(o1.getKey()) : o1.getValue() - o2.getValue());
            //维护size为k的小根堆
            for (Map.Entry 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 entry = (Map.Entry) pq.poll();
                res[i][0] = entry.getKey();
                res[i][1] = String.valueOf(entry.getValue());
            }
            return res;
        }
    }

  • 相关阅读:
    【kali-权限提升】(4.2.2)社会工程学工具包:web站点克隆钓鱼
    【css面试题】 实现一个盒子的水平竖直居中对齐效果
    【推荐】SpringMVC与JSON数据返回及异常处理机制的使用
    ESP32 Arduino实战协议篇-BLE 服务端实现温度和湿度数据传输
    Web 应用程序安全检查表
    Linux 查看日志
    使用:git 命令
    初级HTML基础
    [Python进阶] 消息框、弹窗:tkinter库
    用户运营中,培养种子用户的三种模式
  • 原文地址:https://blog.csdn.net/chenyong6301567/article/details/126886596