写点什么

【LeetCode】根据字符出现频率排序 Java 题解

用户头像
HQ数字卡
关注
发布于: 1 小时前

题目描述

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


示例 1:
输入:"tree"
输出:"eert"
解释:'e'出现两次,'r'和't'都只出现一次。因此'e'必须出现在'r'和't'之前。此外,"eetr"也是一个有效的答案。
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/sort-characters-by-frequency著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
复制代码

思路分析

  • 这个题目简短,题意容易理解。首先需要统计出每个字符的词频,根据词频排序,输出结果。

代码

    public String frequencySort(String s) {        Map<Character, Integer> map = new HashMap<>();        for (char ch : s.toCharArray()) {            map.put(ch, map.getOrDefault(ch, 0) + 1);        }
List<Character> list = new ArrayList<>(map.keySet()); Collections.sort(list, (a, b) -> map.get(b) - map.get(a)); StringBuffer ans = new StringBuffer(); for (char item : list) { int frequency = map.get(item); while (frequency > 0) { ans.append(item); frequency--; } }
return ans.toString(); }
复制代码


    public String frequencySort(String s) {        Map<Character, Integer> map = new HashMap<>();        int maxFreq = 0;        for (char ch : s.toCharArray()) {            int tempNum = map.getOrDefault(ch, 0) + 1;            map.put(ch, tempNum);            maxFreq = Math.max(tempNum, maxFreq);        }        StringBuffer[] buckets = new StringBuffer[maxFreq + 1];        for (int i = 0; i <= maxFreq; i++) {            buckets[i] = new StringBuffer();        }
for (Map.Entry<Character, Integer> entry : map.entrySet()) { char c = entry.getKey(); int frequency = entry.getValue(); buckets[frequency].append(c); }
StringBuffer ans = new StringBuffer(); for (int i = maxFreq; i > 0; i--) { StringBuffer bucket = buckets[i]; int size = bucket.length(); for (int j = 0; j < size; j++) { for (int k = 0; k < i; k++) { ans.append(bucket.charAt(j)); } } } return ans.toString(); }
复制代码

总结

  • 方法一代码的空间复杂度是 O(n + k) , 时间复杂度是 O (n + k * log (k) ) , 其中 n 是字符串的长度, k 是不同字符的个数。

  • 方法二采用桶排序, 时间复杂度是 O(n + k), 空间复杂度是 O(n + k),

  • 坚持每日一题,加油!

发布于: 1 小时前阅读数: 2
用户头像

HQ数字卡

关注

还未添加个人签名 2019.09.29 加入

LeetCode,略懂后端的RD

评论

发布
暂无评论
【LeetCode】根据字符出现频率排序Java题解