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

字符串出现次数的TopK问题

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

统计频率 遇到的问题

 //这个统计不了,因为putIfAbsent这个函数遇到重复的key会舍弃新插入的值
map.putIfAbsent(strings[i],map.getOrDefault(strings[i],0)+1);
//而put的策略是 覆盖掉旧值
 map.put(strings[i],map.getOrDefault(strings[i],0)+1);

步骤:

  1. 统计频率
  2. 构建最小堆,保证只能插入k个元素
  3. 输出堆顶,堆顶为最小值,需要倒序构建结果集
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
        String[][] strs = new String[k][2];
        if(strings.length == 0 || k == 0) return strs;
        //统计频率
        HashMap<String,Integer> map = new HashMap();
         for(int i=0;i<strings.length;i++){
          
            map.put(strings[i],map.getOrDefault(strings[i],0)+1);
     
        }
        Set<Map.Entry<String,Integer>> entr = map.entrySet();
        //构建小顶堆
        PriorityQueue<Map.Entry<String,Integer>> queue = new PriorityQueue<>((
            o1,o2) -> {
            int t = o1.getValue() - o2.getValue();
            if(t != 0) {
                return t;
            } else {
                return o2.getKey().compareTo(o1.getKey());
            }
        });
        //加入元素
        for(Map.Entry<String,Integer> i : entr) {
            queue.offer(i);
            if(queue.size() > k) {
                queue.poll();
            }
        }
        //倒序遍历,生成结果集
        for(int i = k - 1; i >= 0; i--) {
            Map.Entry<String,Integer> temp = queue.poll();
            strs[i][0] = temp.getKey();
            strs[i][1] = temp.getValue() + "";
        }
        return strs;
    }
}
全部评论

相关推荐

01-01 23:38
门头沟学院 Java
杭州同花顺 后端开发 1.5n左右
想当offer收割机的肖恩很爱刷美剧:现在这个环境,狠狠赚钱才是实际的,1是银行的子公司,技术很老,现在银行都在大规模降薪这种科技子公司肯定也在逐渐降薪,而且你也不好跳槽;2虽然钱比1多,但是各种福利待遇基本全无,加班时间可能跟1差不多,但是后续跳槽会比1好;3是大平台,而且钱确实给的很够,发展前景就不用看了,现在这个环境技术发展前景并不一定就好,非技术并不一定就差。个人认为3>2>1
点赞 评论 收藏
分享
嗷佛快来快来快快快来:我当时就是听了别人的谣言,环境的大变,左右摇摆不定,到最后一事无成。我也给你提不了什么有效的建议,因为我自己就是败犬。但是我确实是从cpp转到了Java,cpp也做过项目,了解过具体的细分方向。如果你感兴趣,不会拦你。因为只要一件事情能坚持下去 就会发光
点赞 评论 收藏
分享
2024-12-11 14:09
已编辑
中国海洋大学 数值策划
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务