【LeetCode】451-根据字符出现频率排序

题目描述

给定一个字符串,请将字符串里的字符按照出现的频率降序排列。

示例 1:

输入:
"tree"

输出:
"eert"

解释:
'e'出现两次,'r'和't'都只出现一次。
因此'e'必须出现在'r'和't'之前。此外,"eetr"也是一个有效的答案。

示例 2:

输入:
"cccaaa"

输出:
"cccaaa"

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

示例 3:

输入:
"Aabb"

输出:
"bbAa"

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

解题思路

使用桶排序,和第 347 题思路基本一致,区别就是,第 347 题是对动态数组的操作,本题是对字符串的操作。

Java 实现

public String frequencySort (String s) {
    HashMap<Character,Integer> frequencyMap = new HashMap<>();
    for (char c : s.toCharArray()) {
        frequencyMap.put(c, frequencyMap.getOrDefault(c, 0) + 1);
    }

    List<Character>[] bucket = new ArrayList[s.length() + 1];
    for (Character character : frequencyMap.keySet()) {
        int frequency = frequencyMap.get(character);
        if (bucket[frequency] == null) {
            bucket[frequency] = new ArrayList();
        }
        bucket[frequency].add(character);
    }
    StringBuilder ans = new StringBuilder();
    for (int i = bucket.length - 1; i > 0; i--) {
        if (bucket[i] == null)
            continue;
        for (Character character : bucket[i]) {
            for (int j = 0; j < i; j++) {
                ans.append(character);
            }
        }
    }
    return ans.toString();
}
上一篇:113.输入10个国家的名字,按由小到大排序


下一篇:九民纪要-违约金调整的基数以合同法113条为基数(可得利益损失)