2022/01/[路飞][LeetCode]451_根据字符出现频率排序/index

「这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战

看一百遍美女,美女也不一定是你的。但你刷一百遍算法,知识就是你的了~~

谁能九层台,不用累土起!

题目地址

题目

给定一个字符串,请将字符串里的字符按照出现的频率降序排列。

示例 1:

1
2
3
4
5
6
7
8
输入:
"tree"

输出:
"eert"

解释: 'e'出现两次,'r'和't'都只出现一次。
因此'e'必须出现在'r'和't'之前。此外,"eetr"也是一个有效的答案。

示例 2:

1
2
3
4
5
6
7
8
输入:
"cccaaa"

输出:
"cccaaa"

解释: 'c'和'a'都出现三次。此外,"aaaccc"也是有效的答案。
注意"cacaca"是不正确的,因为相同的字母必须放在一起。

示例 3:

1
2
3
4
5
6
7
8
输入:
"Aabb"

输出:
"bbAa"

解释: 此外,"bbaA"也是一个有效的答案,但"Aabb"是不正确的。
注意'A'和'a'被认为是两种不同的字符。

解题思路

  • 我们使用map来存储所有的字符
  • 如果该字符出现过,就将该字符出现的次数+1
  • 否则,设置该字符出现的次数为1
  • map转为Array类型进行排序(转换后每一项都是数组,第一个元素为字符第二个为出现的次数)
  • 使用进行数组降序排序
  • 拼接字符串,输出结果

解题代码

1
2
3
4
5
6
7
8
9
10
11
12
var frequencySort = function(s) {
let map = new Map()
let res = ''
for(let z of s){
map.set(z,(map.get(z)||0)+1)
}
const arr = [...map].sort((a, b) => b[1] - a[1])
for(let [k,v] of arr){
res += k.repeat(v)
}
return res
};

使用大顶堆

  • 我们之前用map来存储的操作都与上方一致
  • 排序使用大顶堆来完成
  • map中的内容存入大顶堆后将大顶堆转化成数组(此时的数组已经是排好序的了)
  • 遍历数组的内容,拿到字符串以及出现的次数
  • 拼接字符串,输出结果
1
2
3
4
5
6
7
8
9
10
11
12
13
var frequencySort = function(s) {
let map = new Map()
let res = ''
for(let z of s){
map.set(z,(map.get(z)||0)+1)
}
const maxQueue = new MaxPriorityQueue()
map.forEach((val,key)=>{
maxQueue.enqueue(key,val)
})
maxQueue.toArray().forEach(v=> res+= v.element.repeat(v.priority))
return res
};

如有任何问题或建议,欢迎留言讨论!

文章作者: Joker
文章链接: https://qytayh.github.io/2022/01/[%E8%B7%AF%E9%A3%9E][LeetCode]451_%E6%A0%B9%E6%8D%AE%E5%AD%97%E7%AC%A6%E5%87%BA%E7%8E%B0%E9%A2%91%E7%8E%87%E6%8E%92%E5%BA%8F/index/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Joker's Blog