给定一个字符串,请将字符串里的字符按照出现的频率降序排列。
class Solution {
public String frequencySort(String s) {
//用数组先统计
char[] ch = s.toCharArray();
int[] arr = new int[128];
for (char c : ch) {
arr[c]++;
}
//大顶堆
//按照出现的个数从大到小排序,如果次数相等,按照下标从大到小排序
//这里把字符转成数字(即数组的下标),等到最后再转成字符
PriorityQueue<Integer> heap = new PriorityQueue<>((o1, o2) -> arr[o2] == arr[o1] ? o2 - o1 : arr[o2] - arr[o1]);
//遍历数组,如果出现次数为0,跳过,否则把下标放到堆中
for (int i = 0; i < arr.length; i++) {
if (arr[i] == 0) continue;
heap.offer(i);
}
//进行拼接
StringBuilder res = new StringBuilder();
while (!heap.isEmpty()) {
//取出下标,然后通过此下标在数组中对应的次数重复拼接
int c = heap.poll();
for (int i = 0; i < arr[c]; i++) {
//在这里才把下标转成字符
res.append((char)c);
}
}
return res.toString();
}
}
花了两小时,时间和空间复杂度都快接近最优解了,能力极限了。