1. 程式人生 > 實用技巧 >LeetCode451. 根據字元出現頻率排序

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(); } }