LeetCode451. 根據字元出現頻率排序
阿新 • • 發佈:2020-12-10
一、題目描述
二、解法
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(); } }