LeetCode 451. 根据字符出现频率排序(Java 代码)

题目

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

示例 1:

输入:
"tree"

输出:
"eert"

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

思路

需要统计字符串中每个字符出现的次数。

  • 这样需要用到 Map字典存储 字符和出现的次数 键值对(遍历字符串得到)

使用桶排序,将相同次数的字符装入一个桶子里头

  • 使用 List 数组: List<Character>[] = List[str.length()+1],最后需要+1(特例:全部都是重复的字符串)

从后往前,将桶子里头的字符倒出来。(有的桶子是空的,不用倒)

Java 代码

class Solution {
    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>[] lists = new List[s.length()+1];
        for(char key:map.keySet()){
            int count = map.get(key);
            if(lists[count] == null)
                lists[count] = new ArrayList<Character>();
            lists[count].add(key);
        }

        // 拼接字符
        int len = lists.length;
        StringBuilder sb = new StringBuilder("");
        for(int i=len-1; i>=0; i--){
            if(lists[i] == null) continue;
                // 将一个桶子里头的所有字符都倒出来
                while(lists[i].size() > 0){
                    char ch = lists[i].remove(0);
                    // 需要乘以字符出现的次数
                    for(int j=0; j<i; j++){
                        sb.append(ch);
                    }
                }
            }
        return sb.toString();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值