1. 具体题目
给定一个字符串,请将字符串里的字符按照出现的频率降序排列。
示例 1: 输入: "tree" 输出: "eert" 解释: 'e'出现两次,'r'和't'都只出现一次。因此'e'必须出现在'r'和't'之前。此外,"eetr"也是一个有效的答案。
2.思路分析
桶排序,思路同 leetcode347(https://www.cnblogs.com/XRH2019/p/11959468.html)
注意:向字符串中添加字符用 StringBuffer,直接用"string" + char 会超出时间限制
3. 代码
1 public String frequencySort(String s) { 2 HashMap<Character,Integer> map = new HashMap<>(); 3 for(int i = 0; i < s.length(); i++){ 4 char c = s.charAt(i); 5 map.put(c, map.getOrDefault(c,0) + 1); 6 } 7 List<Character>[] frequency = new ArrayList[s.length() + 1]; 8 for(char key : map.keySet()){ 9 int index = map.get(key); 10 if(frequency[index] == null){ 11 frequency[index] = new ArrayList<>(); 12 } 13 frequency[index].add(key); 14 } 15 StringBuffer ans = new StringBuffer(); 16 for(int i = frequency.length - 1; i >= 0; i--){ 17 if(frequency[i] == null) continue; 18 for(char c : frequency[i]){ 19 for(int count = 0; count < i; count++){ 20 ans.append(c); 21 } 22 } 23 } 24 return ans.toString(); 25 }