题目
给定一个字符串,请将字符串里的字符按照出现的频率降序排列。
示例 1:
输入:
"tree"
输出:
"eert"
解释:
'e'出现两次,'r'和't'都只出现一次。
因此'e'必须出现在'r'和't'之前。此外,"eetr"也是一个有效的答案。
思路
需要统计字符串中每个字符出现的次数。
- 这样需要用到 Map字典存储 字符和出现的次数 键值对(遍历字符串得到)
使用桶排序,将相同次数的字符装入一个桶子里头
- 使用 List 数组:
List<Character>[] = List[str.length()+1]
,最后需要+1(特例:全部都是重复的字符串)
从后往前,将桶子里头的字符倒出来。(有的桶子是空的,不用倒)
Java 代码
class Solution {
public String frequencySort(String s) {
Map<Character, Integer> map = new HashMap<>();
// 存入集合
for(char ch:s.toCharArray()){
map.put(ch, map.getOrDefault(ch, 0)+1);
}
//进行桶排序
List<Character>[] lists = new List[s.length()+1];
for(char key:map.keySet()){
int count = map.get(key);
if(lists[count] == null)
lists[count] = new ArrayList<Character>();
lists[count].add(key);
}
// 拼接字符
int len = lists.length;
StringBuilder sb = new StringBuilder("");
for(int i=len-1; i>=0; i--){
if(lists[i] == null) continue;
// 将一个桶子里头的所有字符都倒出来
while(lists[i].size() > 0){
char ch = lists[i].remove(0);
// 需要乘以字符出现的次数
for(int j=0; j<i; j++){
sb.append(ch);
}
}
}
return sb.toString();
}
}