451. 根据字符出现频率排序
给定一个字符串,请将字符串里的字符按照出现的频率降序排列。
示例 1:
输入:
"tree"
输出:
"eert"
解释:
'e'出现两次,'r'和't'都只出现一次。
因此'e'必须出现在'r'和't'之前。此外,"eetr"也是一个有效的答案。
示例 2:
输入:
"cccaaa"
输出:
"cccaaa"
解释:
'c'和'a'都出现三次。此外,"aaaccc"也是有效的答案。
注意"cacaca"是不正确的,因为相同的字母必须放在一起。
示例 3:
输入:
"Aabb"
输出:
"bbAa"
解释:
此外,"bbaA"也是一个有效的答案,但"Aabb"是不正确的。
注意'A'和'a'被认为是两种不同的字符。
桶排序
设置若干个桶,每个桶存储出现频率相同的数。桶的下标表示数出现的频率,即第 i 个桶中存储的数出现的频率为 i
把数都放到桶之后,从后向前遍历桶,最先得到的 k 个数就是出现频率最多的的 k 个数
func frequencySort(s string) string {
//将字符串转换成字节切片
strlist := []byte(s)
//创建map
buketmap := map[byte]int{}
//创建最大值
maxnums := 0
for _, str := range strlist {
buketmap[str]++
//记录最大值
if buketmap[str] > maxnums {
maxnums = buketmap[str]
}
}
//创建二维切片,将数量为count个的str放进 第count-1个切片中
buketlist := make([][]byte, maxnums)
for str, count := range buketmap {
buketlist[count-1] = append(buketlist[count-1], str)
}
//创建结果切片
var results []byte
for i := maxnums - 1; i >= 0; i-- {
//如果第i个切片长度>1,说明存在两个字符数量一样,则分别存入,否则数量为1则直接加进结果列表
if len(buketlist[i]) > 1 {
for j := 0; j < len(buketlist[i]); j++ {
results = append(results, []byte(strings.Repeat(string(buketlist[i][j]), i+1) )...)
}
}else {
results = append(results, []byte(strings.Repeat(string(buketlist[i]), i+1) )...)
}
}
//最后转换成字符串输出
return string(results)
}