1.题目
有一组单词,要求统计前K个出现次数最多的单词。
要求:
按照出现次数从高到低排序;
如果出现频率相同,字符串按照字典序排序
2.分析
创建HashMap,统计每个单词出现的次数;
创建小根堆minHeap,遍历HashMap,把出现频率高的放到里面;如果出现次数相同,我们把字符大的放到里面。
创建ArrayList,从小根堆中弹出元素放入ArrayList,这时它是从小到大排序。
逆转ArrayList
3.代码
class Solution {
public List<String> topKFrequent(String[] words, int k) {
Map<String, Integer> map = new HashMap<>();
for(int i = 0; i < words.length; i++) {
String s = words[i];
if(map.containsKey(s)) {
int value = map.get(s);
map.put(s, value + 1);
}else {
map.put(s, 1);
}
}
//建立小根堆
PriorityQueue<Map.Entry<String, Integer>> minHeap = new PriorityQueue<>(k, new Comparator<Map.Entry<String, Integer>>(){
public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
if(o1.getValue().compareTo(o2.getValue()) == 0) {
return o2.getKey().compareTo(o1.getKey());
}
return o1.getValue().compareTo(o2.getValue());
}
}) ;
for(Map.Entry<String, Integer> entry : map.entrySet()) {
if(k > 0) {
minHeap.offer(entry);
k--;
}else {
Map.Entry<String, Integer> top = minHeap.peek();
if(top.getValue().compareTo(entry.getValue()) < 0) {
minHeap.poll();
minHeap.add(entry);
}else {
//value相同,比较字母
if(top.getValue().compareTo(entry.getValue()) == 0) {
if(top.getKey().compareTo(entry.getKey()) > 0) {
minHeap.poll();
minHeap.add(entry);
}
}
}
}
}
List<String> ret = new ArrayList<>();
while(!minHeap.isEmpty()) {
String key = minHeap.poll().getKey();
ret.add(key);
}
Collections.reverse(ret);
return ret;
}
}