代码链接:https://leetcode.cn/problems/top-k-frequent-words/solution/ha-xi-biao-dui-by-comprehensive-xjfp/
解题思路:哈希表+排序
1、用哈希表存储单词出现频率, key是word, value是出现频率
2、根据哈希表中的value进行排序, 分为两种情况:
- value不相等时, 值大的排在前边
- value相等时, 按照key的字典顺序从小到大
3、排序完成后,即可输出前k个key
class Solution:
def topKFrequent(self, words: List[str], k: int) -> List[str]:
hashmap = {}
for s in words:
if s in hashmap:
hashmap[s] += 1
else:
hashmap[s] = 1
lst = sorted(hashmap.items(), key = lambda x: (-x[-1], x[0]), reverse=False)
res = []
for i in range(k):
res.append(lst[i][0])
return res
哈希表构建方法:下述两种方法等价
for s in words:
if s in hashmap:
hashmap[s] += 1
else:
hashmap[s] = 1
from collections import Counter
hashmap = Counter(words)
sorted(hashmap.items(), key = lambda x: (-x[-1], x[0]), reverse=False)
x[1]和x[-1]表示值,x[0]表示键。先按照值排序,再按照键排序。
字典排序参考链接:
lambda 是一个匿名函数。这里的 x 表示我们给 sorted 方法的输入 counter。优先按照 -x[1] 来排序,如果 -x[1] 相同的情况下,再按照 x[0] 来排序。
你可以看到对于每一个对(pair),例如 (‘and’, 17474),如果说它是 x,那么它的第一个元素是 x[0],也就是 ‘and’ 这个单词;它的第二个元素是 17474,表示它的出现频次,是 17474 次。
因为如果不加 -x[1] 那个负号,那么就是按照正序排列(从小到大的顺序):1, 2, 3, 4, 5, 6, … 17474, 18000, 21196, 23638, 24400, 32481, 42068, 45020, 50770
但是加了负号,就变成按照逆序排列了:-50770, -45020, -42068, -32481, -24400, -23638, -21196, -18000, -17474, … -6, -5, -4, -3, -2, -1
|