题解 | 字符串出现次数的TopK问题

字符串出现次数的TopK问题

https://www.nowcoder.com/practice/fd711bdfa0e840b381d7e1b82183b3ee

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) {
        // write code here
        if (k == 0 || strings.length == 0 || strings == null) return new String[0][0];
        HashMap<String, Integer> hash = new HashMap<String, Integer>();
        //统计字符串出现的频率
        for (String s : strings)
            hash.put(s, hash.getOrDefault(s, 0) + 1);
        //构造大小为K的最小堆
        //Map.Entry方法,将哈希表中的行取出来,就是取出来一个键值对
        PriorityQueue<Map.Entry<String, Integer>> pq = new PriorityQueue<>(
        (a, b) -> {
            // 频率不相同时:频率升序(频率低的在堆顶,准备被踢出)
            if (!a.getValue().equals(b.getValue())) {
                return a.getValue() - b.getValue();
            }
            // 频率相同时:字典序降序(字典序大的在堆顶,准备被踢出)
            else {
                return b.getKey().compareTo(a.getKey());
            }
        }
        );

        // 遍历 HashMap,维护大小为 K 的堆
        // hash.entrySet()方法,将取出来的每一行键值对构造成一个数组
        for (Map.Entry<String, Integer> entry : hash.entrySet()) {
            pq.offer(entry);
            // 如果堆里元素超过 K 个,就把最弱的(堆顶)弹出去
            if (pq.size() > k) {
                pq.poll();
            }
        }

        // 将堆里的元素取出来,放入结果数组
        // 因为堆顶是最后剩下的 K 个里最弱的,所以我们要倒序填充数组
        String[][] res = new String[k][2];
        for (int i = k - 1; i >= 0; i--) {
            Map.Entry<String, Integer> entry = pq.poll();
            res[i][0] = entry.getKey();
            res[i][1] = String.valueOf(entry.getValue());
        }

        return res;
    }
}

全部评论

相关推荐

03-13 14:21
已编辑
江西警察学院 前端工程师
站队站对牛:红红一大片 天都要塌了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务