笔试-根据字符串出现频率排序

笔试-根据字符串出现频率排序

https://leetcode.cn/problems/sort-characters-by-frequency/description/

给定一个字符串 s ,根据字符出现的 频率 对其进行 降序排序 。一个字符出现的 频率 是它出现在字符串中的次数。
返回 已排序的字符串 。如果有多个答案,返回其中任何一个。 示例 1:
输入: s = "tree" 输出: "eert" 解释: 'e'出现两次,'r'和't'都只出现一次。因此'e'必须出现在'r'和't'之前。此外,"eetr"也是一个有效的答案。

示例 2:
输入: s = "cccaaa" 输出: "cccaaa" 解释: 'c'和'a'都出现三次。此外,"aaaccc"也是有效的答案。注意"cacaca"是不正确的,因为相同的字母必须放在一起。

示例 3:
输入: s = "Aabb" 输出: "bbAa" 解释: 此外,"bbaA"也是一个有效的答案,但"Aabb"是不正确的。注意'A'和'a'被认为是两种不同的字符。

 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
30
31
32
33
34
35
36
37
38
39
40
public class Main {  
  
    public static void sortDesc(String str){  
        Map<Character, Integer> countMap = new HashMap<>();  
        for (int i = 0; i < str.length(); i++) {  
            char c = str.charAt(i);  
            if (countMap.containsKey(c)){  
                Integer integer = countMap.get(c);  
                countMap.put(c,integer + 1);  
            }else {  
                countMap.put(c, 1);  
            }  
        }  
        Map<Character, Integer> sortMap = new LinkedHashMap<>();  
        countMap.entrySet()  
                .stream()  
                // 倒序  
                .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))  
                .forEachOrdered(i -> sortMap.put(i.getKey(), i.getValue()));  
        // 所有字符  
        Set<Character> characters = sortMap.keySet();  
        char[] res = new char[str.length()];  
        int i = 0;  
        for (char c : characters){  
            int count = sortMap.get(c);  
            for (int j = 0; j < count; j++) {  
                res[i] = c;  
                i++;  
            }  
        }  
        System.out.println(String.valueOf(res));  
    }  
  
  
    public static void main(String[] args) {  
        sortDesc("tree");  
        sortDesc("cccaaa");  
        sortDesc("Aabb");  
    }  
}
updatedupdated2024-11-082024-11-08