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; } } } }