leetcode 626前K个高频单词

问题描述

给一非空的单词列表,返回前 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);
    }
}
上一篇:字符串


下一篇:[CISCN2019 初赛]Love Math