1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Solution {
public String frequencySort(String s) {
int[] charFreq = new int[128];
int charMaxFreq = 0;
for (int i = 0; i < s.length(); i++) {
charFreq[s.charAt(i)] += 1;
charMaxFreq = Math.max(charMaxFreq, charFreq[s.charAt(i)]);
}
List<List<Character>> buckets = new ArrayList<>();
for (int i = 0; i <= charMaxFreq; i++) {
buckets.add(new ArrayList<>());
}
for (int i = 0; i < charFreq.length; i++) {
if (charFreq[i] == 0) {
continue;
}
buckets.get(charFreq[i]).add((char) i);
}
StringBuilder ans = new StringBuilder();
for (int i = buckets.size() - 1; i >= 0; i--) {
for (Character c : buckets.get(i)) {
for (int j = 0; j < i; j++) {
ans.append(c);
}
}
}
return ans.toString();
}
}

bucket sort. 我们遍历完一遍后知道每个char的frequency是多少了. 同时也知道最大的frequency是多少. 于是我们创建一个长度为frequency + 1的list, 然后把每个char放入相应的bucket中. 比如某个char的frequency是10, 那么就把它放到list中index是10的位置. 放完后, 我们倒着遍历即可.

等于是用数组的index标记不同freq的char应该放在哪里.

当时我就在想如果我知道了所有char的frequency, 我该怎么把它们倒着排序. 用treemap也行.

时间复杂度: O

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Solution {
public String frequencySort(String s) {
int[] charFreq = new int[128];
for (int i = 0; i < s.length(); i++) {
charFreq[s.charAt(i)] += 1;
}
TreeMap<Integer, List<Character>> freqCharListMap = new TreeMap<>((a, b) -> Integer.compare(b, a));
for (int i = 0; i < charFreq.length; i++) {
if (charFreq[i] == 0) {
continue;
}
freqCharListMap.putIfAbsent(charFreq[i], new ArrayList<>());
freqCharListMap.get(charFreq[i]).add((char) i);
}
StringBuilder ans = new StringBuilder();
for (Map.Entry<Integer, List<Character>> entrySet : freqCharListMap.entrySet()) {
int freq = entrySet.getKey();
for (Character c : entrySet.getValue()) {
for (int i = 0; i < freq; i++) {
ans.append(c);
}
}
}
return ans.toString();
}
}

这就是treemap的做法.