一、题目描述

二、解法
class Solution {
public String frequencySort(String s) {
if (s == null || s.length() <= 2) return s;
Map<Character,Integer> map = new HashMap<>();
for (char c : s.toCharArray()) {
map.put(c,map.getOrDefault(c, 0) + 1);
}
/**
* 方法1: 使用List寻找合适的插入位置
* 执行耗时:776 ms,击败了6.68% 的Java用户
* 内存消耗:40.4 MB,击败了7.68% 的Java用户
*/
/*List<Character> list = new ArrayList<>();
int index = list.size();
for (char c : map.keySet()) {
for (int i = 0; i < list.size(); i++) {
if (map.get(c) > map.get(list.get(i))) {
index = i;
break;
}
}
for (int i = 0; i < map.get(c); i++) {
list.add(index, c);
}
index = list.size();
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < list.size(); i++) {
sb.append(list.get(i));
}
return sb.toString();*/
/**
* 方法2:使用大顶堆
* 执行耗时:21 ms,击败了46.47% 的Java用户
* 内存消耗:39.3 MB,击败了80.18% 的Java用户
*/
// o1-o2表示前一个数-后一个数,如果>0则交换,实现升序。相反,o2-o1为降序。
PriorityQueue<Character> maxHeap = new PriorityQueue<>(
(o1, o2) -> map.get(o2) - map.get(o1));
maxHeap.addAll(map.keySet());
StringBuilder sb = new StringBuilder();
while (!maxHeap.isEmpty()) {
char c = maxHeap.poll();
for (int i = 0; i < map.get(c); i++) {
sb.append(c);
}
}
return sb.toString();
}
}