package data.leetcode.hash; import java.util.*; public class Leetcode692 { /** * 给一非空的单词列表,返回前 k 个出现次数最多的单词。 *

* 返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率,按字母顺序排序。 *

* 示例 1: *

* 输入: ["i", "love", "leetcode", "i", "love", "coding"], k = 2 * 输出: ["i", "love"] * 解析: "i" 和 "love" 为出现次数最多的两个单词,均为2次。 * 注意,按字母顺序 "i" 在 "love" 之前。 */ /** * 执行用时 : 17 ms, 在Top K Frequent Words的Java提交中击败了83.42% 的用户 * 内存消耗 : 41.2 MB, 在Top K Frequent Words的Java提交中击败了74.16% 的用户 * @param words * @param k * @return */ public static List topKFrequent(String[] words, int k) { HashMap wordMap = new HashMap(); List wordList = new ArrayList<>(); for (int i = 0; i < words.length; i++) { Integer node = wordMap.get(words[i]); if (node == null) node = 0; node += 1; wordMap.put(words[i], node); } List> list = new ArrayList>(wordMap.entrySet()); Collections.sort(list, new Comparator>() { @Override public int compare(Map.Entry o1, Map.Entry o2) { int code = o1.getValue() - o2.getValue(); if (code != 0) { return -code; } else { return o1.getKey().compareTo(o2.getKey()); } } }); List> entries = list.subList(0, k); for (Map.Entry entry : entries) { wordList.add(entry.getKey()); } return wordList; } public static void main(String[] args) { String words[] = {"i", "love", "leetcode", "i", "love", "coding"}; topKFrequent(words, 3); } }