出现次数的 TopK 问题
出现次数的TopK问题
http://www.nowcoder.com/questionTerminal/fd711bdfa0e840b381d7e1b82183b3ee
Top K 问题首先想到堆,这道题还好定制一个比较器 用 PriorityQueue 就可以了,不需要动态调整堆结构。所以不需要手写堆逻辑
哈哈偷了个懒,其实建议还是自己实现一个堆比较扎实能加深一下印象。
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
PriorityQueue<MyNode> queue=new PriorityQueue<>(new MyComparator());
HashMap<String,Integer> map=new HashMap<>(16);
for (int i=0;i<strings.length;i++){
if (map.containsKey(strings[i])){
map.put(strings[i],map.get(strings[i])+1);
}else {
map.put(strings[i],1);
}
}
//入堆
for (Map.Entry<String,Integer> entry:map.entrySet()){
queue.add(new MyNode(entry.getKey(),entry.getValue()));
}
String[][] result=new String[k][2];
int j=0;
while (j<k&&!queue.isEmpty()){
MyNode node=queue.poll();
result[j][0]=node.val;
result[j++][1]= String.valueOf(node.num);
}
return result;
}
class MyNode{
String val;
int num;
MyNode(String val,int num){
this.num=num;
this.val=val;
}
}
class MyComparator implements Comparator<MyNode> {
@Override
public int compare(MyNode o1, MyNode o2) {
if (o1.num==o2.num){
//字典序小的在前 所以 o1 比 o2
return o1.val.compareTo(o2.val);
}else {
//数量大的在前所以 o2 - o1
return o2.num-o1.num;
}
}
}
}