根据字符出现频率排序

给定一个字符串 s ,根据字符出现的 频率 对其进行 降序排序 。一个字符出现的 频率 是它出现在字符串中的次数。
链接:https://leetcode.cn/problems/sort-characters-by-frequency

  1. HashMap 统计每个字符出现的频率

tips:采用 getOrDefault 计数。若 map 不存在此key 则计数为0,存在则在原来的计数中加1
charFreqMap.put(c, charFreqMap.getOrDefault(c, 0) + 1);

  1. 优先级队列将字符入队列,比较器为:字符出现的频率。构造大顶堆
  2. 出队列,获取字符出现的次数,拼接结果。
    public String frequencySort(String s) {
        Map<Character, Integer> charFreqMap = new HashMap<>();
        //记录每个字符出现的频率
        for (int i = 0; i < s.length(); i++) {
            Character c = s.charAt(i);
            charFreqMap.put(c, charFreqMap.getOrDefault(c, 0) + 1);
        }

        //定义比较器: 按字符频率大小进行比较
        Comparator<Character> comparator = (o1, o2) -> charFreqMap.getOrDefault(o2, 0).compareTo(charFreqMap.getOrDefault(o1, 0));
        PriorityQueue<Character> pq = new PriorityQueue<>(comparator);

        for (Map.Entry<Character, Integer> entry : charFreqMap.entrySet()) {
            //将字符按频率大小放入优先级队列
            pq.add(entry.getKey());
        }

        StringBuilder sb = new StringBuilder();
        while (!pq.isEmpty()) {
            Character c = pq.poll();
            Integer freq = charFreqMap.get(c);

            for (int i = 0; i < freq; i++) {
                //重复出现的次数
                sb.append(c);
            }
        }
        return sb.toString();
    }

posted @ 2023-07-10 17:50  大熊猫同学  阅读(87)  评论(0编辑  收藏  举报