问题描述
给一非空的单词列表,返回前 k 个出现次数最多的单词。
返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率,按字母顺序排序。
https://leetcode-cn.com/problems/top-k-frequent-words/
示例:
输入: [“i”, “love”, “leetcode”, “i”, “love”, “coding”], k = 2
输出: [“i”, “love”]
解析: “i” 和 “love” 为出现次数最多的两个单词,均为2次。
注意,按字母顺序 “i” 在 “love” 之前。
解题思路
这个题我们既要,获取单词,还要获取单词出现的次数,这时我们就可以使用Map这个数据结构来进行存储,首先我们遍历字符串数组,将每一个单词,及其出现的次数加入进去;
可以看出来,我们要返回的是一个List,我们就可以建一个顺序表进行存储,我们可以重写sort排序方法,将其按照出现的次数排序,要是出现的次数一样,就可以按照字典序来进行排序,最后返回前K个元素就可以了。
代码
import java.util.Map;
import java.util.HashMap;
class Solution {
public List<String> topKFrequent(String[] words, int k) {
Map<String,Integer> map = new HashMap<>();
for(String word:words){
Integer value = map.getOrDefault(word,0);
map.put(word,value+1);
}
List<String> wordList = new ArrayList<>(map.keySet());
Collections.sort(wordList,new Comparator<String>(){
@Override
public int compare(String o1,String o2){
int count1 = map.get(o1);
int count2 = map.get(o2);
if(count1==count2){
return o1.compareTo(o2);//字典序
}
return count2-count1;
}
});
return wordList.subList(0,k);
}
}