【LeetCode】451. 根据字符出现频率排序(Java)

    科技2025-01-16  11

    给定一个字符串,请将字符串里的字符按照出现的频率降序排列。

    class Solution { public String frequencySort(String s) { //用数组先统计 char[] ch = s.toCharArray(); int[] arr = new int[128]; for (char c : ch) { arr[c]++; } //大顶堆 //按照出现的个数从大到小排序,如果次数相等,按照下标从大到小排序 //这里把字符转成数字(即数组的下标),等到最后再转成字符 PriorityQueue<Integer> heap = new PriorityQueue<>((o1, o2) -> arr[o2] == arr[o1] ? o2 - o1 : arr[o2] - arr[o1]); //遍历数组,如果出现次数为0,跳过,否则把下标放到堆中 for (int i = 0; i < arr.length; i++) { if (arr[i] == 0) continue; heap.offer(i); } //进行拼接 StringBuilder res = new StringBuilder(); while (!heap.isEmpty()) { //取出下标,然后通过此下标在数组中对应的次数重复拼接 int c = heap.poll(); for (int i = 0; i < arr[c]; i++) { //在这里才把下标转成字符 res.append((char)c); } } return res.toString(); } }

    花了两小时,时间和空间复杂度都快接近最优解了,能力极限了。

    Processed: 0.015, SQL: 8