https://leetcode-cn.com/problems/sort-characters-by-frequency/
描述
样例
输入:"tree"输出:"eert"解释:'e'出现两次,'r'和't'都只出现一次。因此'e'必须出现在'r'和't'之前。此外,"eetr"也是一个有效的答案。输入:"cccaaa"输出:"cccaaa"解释:'c'和'a'都出现三次。此外,"aaaccc"也是有效的答案。注意"cacaca"是不正确的,因为相同的字母必须放在一起。输入:"Aabb"输出:"bbAa"解释:此外,"bbaA"也是一个有效的答案,但"Aabb"是不正确的。注意'A'和'a'被认为是两种不同的字符。
解题思路
- 统计每个单词出现的频率,然后按频率进行排序,然后从频率大的开始拼接字符串。O(n + klogk)。k是有多少个不同字符
看了题解有桶排序的方法,因为字符出现的频率是有上限的,所以把频率当成桶,往里填字符,最后从最大的桶开始拼接字符串
AC代码
public String frequencySort(String s) {Map<Character, Integer> map = new HashMap<>();char[] chars = s.toCharArray();int max = 0;for (int i = 0; i < s.length(); i++) {int freq = map.getOrDefault(chars[i], 0) + 1;map.put(chars[i], freq);max = Math.max(max, freq);}StringBuilder[] build = new StringBuilder[max + 1];for (int i = 0; i < max + 1; i++) {build[i] = new StringBuilder();}for (Character ch : map.keySet()) {build[map.get(ch)].append(ch);}StringBuilder ans = new StringBuilder();for (int i = max; i >0 ; --i) {if (build[i].length() > 0) {for (Character ch : build[i].toString().toCharArray()) {ans.append(String.valueOf(ch).repeat(map.get(ch)));}}}return ans.toString();}
