首页 > 其他 > 详细

[LC] 451. Sort Characters By Frequency

时间:2020-02-16 10:11:02      阅读:69      评论:0      收藏:0      [点我收藏+]

Given a string, sort it in decreasing order based on the frequency of characters.

Example 1:

Input:
"tree"

Output:
"eert"

Explanation:
‘e‘ appears twice while ‘r‘ and ‘t‘ both appear once.
So ‘e‘ must appear before both ‘r‘ and ‘t‘. Therefore "eetr" is also a valid answer.

Solution 1: pq
class Solution {
    public String frequencySort(String s) {
        Map<Character, Integer> map = new HashMap<>();
        for (Character c : s.toCharArray()) {
            map.put(c, map.getOrDefault(c, 0) + 1);
        }
        PriorityQueue<Map.Entry<Character, Integer>> pq = new PriorityQueue<>((a, b) -> b.getValue() - a.getValue());
        pq.addAll(map.entrySet());
        char[] charArr = new char[s.length()];
        int i = 0;
        while (i < charArr.length) {
            Map.Entry<Character, Integer> entry = pq.poll();
            Character cur = entry.getKey();
            Integer times = entry.getValue();
            int j = 0;
            while (j < times) {
                charArr[i + j] = cur;
                j += 1;
            }
            i += times;
        }
        return new String(charArr);
    }
}

 

Solution 2: bucket sort based on Freqency

class Solution {
    public String frequencySort(String s) {
        Map<Character, Integer> map = new HashMap<>();
        for (Character c : s.toCharArray()) {
            map.put(c, map.getOrDefault(c, 0) + 1);
        }
        // have a freq buckets from 0 to s.length, 0 is unused
        List<Character>[] buckets = new List[s.length() + 1];
        for (char c : map.keySet()) {
            int times = map.get(c);
            if (buckets[times] == null) {
                buckets[times] = new LinkedList<>();
            }
            buckets[times].add(c);
        }
        StringBuilder sb = new StringBuilder();
        for (int i = buckets.length - 1;  i >= 0; i--) {
            if (buckets[i] != null) {
                for (char ch: buckets[i]) {
                    for (int j = 0; j < i; j++) {
                        sb.append(ch);
                    }
                }
            }
        }
        return sb.toString();
    }
}

 

[LC] 451. Sort Characters By Frequency

原文:https://www.cnblogs.com/xuanlu/p/12315495.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!