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

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

淙嶙7年前 (2018-07-25)未命名683
描述 有一个不为空且仅包含正整数的数组,找出其中出现频率最高的前 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;
    }
}

相关文章

生成SSH秘钥

生成SSH秘钥

SSH是建立在应用层和传输层基础上的安全协议,其目的是专为远程登录会话和其他网络服务提供安全性的保障,用过SSH远程登录的人都比较熟悉,可以认为SSH是一种安全的Shell。Http登录是需要用户名和...

使用void方法交换两个Integer整数

使用void方法交换两个Integer整数

前提条件:1.参数的传递方式:值传递和引用传递,其中值传递为基础数据类型,引用传递为 对象,数组,集合等2.注意,这里要特殊考虑String,以及Integer、Double等几个基本类型包装类,它们...

找出旋转有序数列的中间值

找出旋转有序数列的中间值

描述 给出一个有序数列随机旋转之后的数列,如原有序数列为:[0,1,2,4,5,6,7] ,旋转之后为[4,5,6,7,0,1,2]。假定数列中无重复元素,且数列长度为奇数。求出旋转数列的中间值...

发表评论

访客

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