# 451 -「java」 哈希表+优先队列解决『根据字符出现频率排序』问题的具体解题思路

Tags:

  • 中等
  • 队列
  • 字符串
  • 哈希

题目链接:

451. 根据字符出现频率排序


解题思路[哈希表统计次数+优先队列]:

  1. 定义HashMap<Character, Integer>, 用于统计原字符串中, 字符(key)出现的次数(value);
  2. 定义优先队列, 并设置该优先队列的排序按照Entry.getValue()的值来比较, 出现次数多的字符优先级高, 排在队首;
  3. 遍历优先队列, 组装返回String;

实现代码:

class Solution {

    public String frequencySort(String s) {
        //1. 统计各个字符的个数
        Map<Character, Integer> container = new HashMap<>();
        for(int i = 0; i< s.length(); i++){ 
            Integer count = container.get(s.charAt(i));
            if (null == count || 0 == count) {
                container.put(s.charAt(i), 1);
            } else {
                container.put(s.charAt(i), count + 1);
            }
        }

        //2. 定义优先队列
        PriorityQueue<Map.Entry<Character, Integer>> pq = new PriorityQueue((o, t1) -> {
            Map.Entry<Character, Integer> o2 = (Map.Entry<Character, Integer>) o;
            Map.Entry<Character, Integer> t2 = (Map.Entry<Character, Integer>) t1;
            return t2.getValue().compareTo(o2.getValue());
        }); 

        pq.addAll(container.entrySet());    //将key-val放入优先队列

        //3. 遍历优先队列并组装输出
        StringBuilder sb = new StringBuilder();
        while (!pq.isEmpty()) { 
            Map.Entry<Character, Integer> entry = pq.poll();
            for (int i = 0; i < entry.getValue(); i++) {
                sb.append(entry.getKey());
            }
        }
        return sb.toString();
    }
}

提交记录[20210703]:

执行用时:25 ms, 在所有 Java 提交中击败了25.11%的用户
内存消耗:39.4 MB, 在所有 Java 提交中击败了49.64%的用户

不纠结....
posted @ 2023-03-15 19:57  zhiyuanZAG  阅读(67)  评论(0)    收藏  举报