zoukankan      html  css  js  c++  java
  • 451. Sort Characters By Frequency

    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.

    Example 2:

    Input:
    "cccaaa"
    
    Output:
    "cccaaa"
    
    Explanation:
    Both 'c' and 'a' appear three times, so "aaaccc" is also a valid answer.
    Note that "cacaca" is incorrect, as the same characters must be together.

    Example 3:

    Input:
    "Aabb"
    
    Output:
    "bbAa"
    
    Explanation:
    "bbaA" is also a valid answer, but "Aabb" is incorrect.
    Note that 'A' and 'a' are treated as two different characters.

    The logic is very similar to NO.347 and here we just use a map a count and according to the frequency to put it into the right bucket. Then we go through the bucket to get the most frequently character and append that to the final stringbuilder.

    public String frequencySort(String s) {
            
            HashMap<Character, Integer> map = new HashMap<>();
            for (char c : s.toCharArray()) {
                map.put(c, map.getOrDefault(c, 0) + 1);
            }
            ArrayList<Character>[] list = new ArrayList[s.length() + 1];
            for (char c : map.keySet()) {
                int frequency = map.get(c);
                
                if (list[frequency] == null) {
                    list[frequency] = new ArrayList<>();
                }
                list[frequency].add(c);
            }
            StringBuilder sb = new StringBuilder();
            for (int i = s.length(); i >= 0; i--) {
                if (list[i] != null) {
                    for (char c : list[i]) {
                        for (int j = 0 ; j < (int)map.get(c); j++) {
                            sb.append(c);
                        }
                        
                    }
                }
            }
            return sb.toString();
        }
    

      

    public String frequencySort(String s) {
            Map<Character, Integer> map = new HashMap<>();
            for (char c : s.toCharArray()) {
                if (map.containsKey(c)) {
                    map.put(c, map.get(c) + 1);
                } else {
                    map.put(c, 1);
                }
            }
            PriorityQueue<Map.Entry<Character, Integer>> pq = new PriorityQueue<>(
                new Comparator<Map.Entry<Character, Integer>>() {
                    @Override
                    public int compare(Map.Entry<Character, Integer> a, Map.Entry<Character, Integer> b) {
                        return b.getValue() - a.getValue();
                    }
                }
            );
            pq.addAll(map.entrySet());
            StringBuilder sb = new StringBuilder();
            while (!pq.isEmpty()) {
                Map.Entry e = pq.poll();
                for (int i = 0; i < (int)e.getValue(); i++) {
                    sb.append(e.getKey());
                }
            }
            return sb.toString();
        }
    

      

  • 相关阅读:
    死啃了String源码之后
    springBoot中Bean的生命周期
    @RequestMapping,@RequsetBody等注解说明
    mybatis的逆向工程的使用
    java中的Arrays这个工具类你真的会用吗
    Search in Rotated Sorted Array leetcode的第33道题
    看了Java的Class的源码,我自闭了
    面试被问了三次的http状态码到底有什么
    搞懂HashMap,这一篇就够了
    十大排序的java实现(配有动图)
  • 原文地址:https://www.cnblogs.com/apanda009/p/7580690.html
Copyright © 2011-2022 走看看