当前位置:首页 > 未命名 > 正文内容

出现频率最高的前 K 个元素

淙嶙7年前 (2018-07-25)未命名564
描述 有一个不为空且仅包含正整数的数组,找出其中出现频率最高的前 K 个数,时间复杂度必须在 O(n log n) 以内。 输入 一行数据包括两部分,一个正整数数组(数字间 ',' 分隔)和一个正整数 K (1 ≤ K ≤ 数组长度),数组和 K 之间有一个空格。 输出 输出包含前 K 个出现频率最高的数,用 ', ' 分隔,保证升序排列。 输入样例 1,1,1,2,2,3 2 输出样例 1,2
private static String solution(String line) {
    // 在此处理单行数据
    String a[] = line.split(" ");
    String[] arr = a[0].split(",");
    int limit = Integer.parseInt(a[1]);
    List<Entity> list = new ArrayList<Entity>();
    Map<Integer,Integer> map = new HashMap<Integer,Integer>();
    for(int i=0;i<arr.length;i++){
        int key = Integer.parseInt(arr[i]);
        if(map.containsKey(key)){
            map.put(key, map.get(key)+1);
        }else{
            map.put(key, 1);
        }
    }
    for(Integer key : map.keySet()){
        Entity e = new Entity();
        e.setKey(key);
        e.setValue(map.get(key));
        list.add(e);
    }
    Collections.sort(list, new Comparator<Entity>(){
        @Override
        public int compare(Entity o1, Entity o2) {
            return o2.getValue().compareTo(o1.getValue());
        }
    });
    int[] count = new int[limit];
    for(int i =0;i<limit;i++){
        Entity e = list.get(i);
        count[i] = e.getKey();
    }
    Arrays.sort(count);
    StringBuilder res = new StringBuilder();
    for(int i=0;i<count.length;i++){
        res.append(count[i]).append(",");
    }
    return res.substring(0, res.length()-1);
}
static class Entity{
    Integer key;
    Integer value;
    public Integer getKey() {
        return key;
    }
    public void setKey(Integer key) {
        this.key = key;
    }
    public Integer getValue() {
        return value;
    }
    public void setValue(Integer value) {
        this.value = value;
    }
}

相关文章

EXPLAIN 命令详解

EXPLAIN 命令详解

在工作中,我们用于捕捉性能问题最常用的就是打开慢查询,定位执行效率差的SQL,那么当我们定位到一个SQL以后还不算完事,我们还需要知道该SQL的执行计划,比如是全表扫描,还是索引扫描,这些都需要...

...

爬楼梯

爬楼梯

描述 在你面前有一个n阶的楼梯,你一步只能上1阶或2阶。请问计算出你可以采用多少种不同的方式爬完这个楼梯。 输入 一个正整数,表示这个楼梯一共有多少阶 输出 一个正整数,...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。