题目
给定一个字符串,请将字符串里的字符按照出现的频率降序排列。
示例 1
输入:
"tree"
输出:
"eert"
解释:
'e'出现两次,'r'和't'都只出现一次。
因此'e'必须出现在'r'和't'之前。此外,"eetr"也是一个有效的答案。
示例 2
输入:
"cccaaa"
输出:
"cccaaa"
解释:
'c'和'a'都出现三次。此外,"aaaccc"也是有效的答案。
注意"cacaca"是不正确的,因为相同的字母必须放在一起。
题解
- 计算每个字母出现的频率
- 利用桶排序,将字母出现的频率映射到对应的数组下标并将该字母装入该数组中
- 将数组中的内容倒序输出,实现了字符串里的字符按照出现的频率降序排列
时间复杂度:O(nmf);其中n是数组arr的长度,m是arr[i]的长度的最大值,f是出现的最大频率值
空间复杂度:O(n*m);其中n是数组arr的长度,m是arr[i]的长度的最大值
var frequencySort = function (s) {
let map = new Map()
for (letter of s) {
if (!map.has(letter)) {
map.set(letter, 1)
} else {
map.set(letter, map.get(letter) + 1)
}
}
let arr = []
map.forEach((value, key) => {
if (!arr[value]) {
arr[value] = [key]
} else {
arr[value].push(key)
}
})
s = ""
for (let i = arr.length - 1; i >= 0; i--) {
for (let j = 0; arr[i] && j < arr[i].length; j++) {
let count = i
while (count) {
s += arr[i][j]
count--
}
}
}
return s
};