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

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

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

相关文章

Java的位运算符详解实例——与(&)、非(~)、或(|)、异或(^)

Java的位运算符详解实例——与(&)、非(~)、或(|)、异或(^)

位运算符主要针对二进制,它包括了:“与”、“非”、“或”、“异或”。从表面上看似乎有点像逻辑运算符,但逻辑运算符是针对两个关系运算符来进行逻辑运算,而位运算符主要针对两个二进制数的位进行逻辑运算。下面...

关于java.lang.UnsupportedOperationException异常

关于java.lang.UnsupportedOperationException异常

在调用Arrays.asList()方法时把一个数组转化成List列表时,对得到的List列表进行add()和remove()操作时出现java.lang.UnsupportedOperationEx...

构建短字符串

构建短字符串

描述 给定任意一个较短的子串,和另一个较长的字符串,判断短的字符串是否能够由长字符串中的字符构建出来,且长串中的每个字符只能用一次。 输入 一行数据包括一个较短的字符串和一个较长的字...

发表评论

访客

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