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

      

  • 相关阅读:
    Python中常见的文件对象内建函数
    数字整除
    Bag标签之校验
    开源硬件交流@上海新车间
    POJ 题目2774 Long Long Message(后缀数组,求最长公共子串长度)
    Linux以下的两种文件锁
    敏捷自己主动化单元測试 (从前台 JavaScript 至后台 Java)
    浅谈关于collection接口及相关容器类(一)
    上传文件 | 下载文件
    几年前再用exjts4,如今extjs5发布了,技术更新快,每次给人惊喜
  • 原文地址:https://www.cnblogs.com/apanda009/p/7580690.html
Copyright © 2011-2022 走看看