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

一、题目描述

二、解法

class Solution {
    public String frequencySort(String s) {
        if (s == null || s.length() <= 2) return s;
        Map<Character,Integer> map = new HashMap<>();
        for (char c : s.toCharArray()) {
            map.put(c,map.getOrDefault(c, 0) + 1);
        }
        /**
         *  方法1: 使用List寻找合适的插入位置
         *      执行耗时:776 ms,击败了6.68% 的Java用户
         *         内存消耗:40.4 MB,击败了7.68% 的Java用户
         */
        /*List<Character> list = new ArrayList<>();
        int index = list.size();
        for (char c : map.keySet()) {
            for (int i = 0; i < list.size(); i++) {
                if (map.get(c) > map.get(list.get(i))) {
                    index = i;
                    break;
                }
            }
            for (int i = 0; i < map.get(c); i++) {
                list.add(index, c);
            }
            index = list.size();
        }
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < list.size(); i++) {
            sb.append(list.get(i));
        }
        return sb.toString();*/
        /**
         * 方法2:使用大顶堆
         *         执行耗时:21 ms,击败了46.47% 的Java用户
         *         内存消耗:39.3 MB,击败了80.18% 的Java用户
         */
        // o1-o2表示前一个数-后一个数,如果>0则交换,实现升序。相反,o2-o1为降序。
        PriorityQueue<Character> maxHeap = new PriorityQueue<>(
                (o1, o2) -> map.get(o2) - map.get(o1));
        maxHeap.addAll(map.keySet());
        StringBuilder sb = new StringBuilder();
        while (!maxHeap.isEmpty()) {
            char c = maxHeap.poll();
            for (int i = 0; i < map.get(c); i++) {
                sb.append(c);
            }
        }
        return sb.toString();
    }
}

 

posted @ 2020-12-10 21:37  不学无墅_NKer  阅读(117)  评论(0编辑  收藏  举报