题目描述【中等】
给一非空的单词列表,返回前
k
个出现次数最多的单词。返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率,按字母顺序排序。
示例 1:
输入:
["i", "love", "leetcode", "i", "love", "coding"]
,k = 2
输出:["i", "love"]
解析:"i"
和"love"
为出现次数最多的两个单词,均为2
次。
注意,按字母顺序"i"
在"love"
之前。
示例 2:
输入:
["the", "day", "is", "sunny", "the", "the", "the", "sunny", "is", "is"]
,k = 4
输出:["the", "is", "sunny", "day"]
解析:"the"
,"is"
,"sunny"
和"day"
是出现次数最多的四个单词,出现次数依次为4
,3
,2
和1
次。
注意:
假定
k
总为有效值,1 ≤ k ≤ 集合元素数
。
输入的单词均由小写字母组成。
题目地址:地址
正式分析
本题看题目要求,就知道使用 hash
但 hash
并没有可以排序的方法,所以要将数据拿出再排序
其实这道题如果不用队列的话,应该算是简单题
具体代码
HASH
解法
function topKFrequent(words: string[], k: number): string[] {
const map = new Map()
words.forEach(word => {
if (map.has(word)) {
map.set(word, map.get(word) + 1)
} else {
map.set(word, 1)
}
})
const results: [string, number][] = []
for (const data of map.entries()) {
results.push(data)
}
return results.sort((a, b) => b[1] - a[1] === 0 ? a[0].localeCompare(b[0]) : b[1] - a[1]).map(item => item[0]).slice(0, k)
};
TS AC,执行用时:104ms
, 在所有 TypeScript
提交中击败了 91.67%
的用户
最后
这道题在提交时,发现有一个在题目中虽然说明了,但仍有暗藏含义的提示:如果不同的单词有相同出现频率,按字母顺序排序
。
例如这个:words = ["aaa","aa","a"], k = 1
如果只是比较 word
的第一个字符,因为根据 words
原始顺序放入 map
,则最后输出的是 ['aaa']
而不是 ['a']
了,所以要使用 localeCompare
或 字符串直接比较后返回 1 / -1
的方法准确排序
如果我在哪里写的有问题,欢迎指出,共同进步,谢谢阅读~