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

      

  • 相关阅读:
    ASP.NET中常用服务器端与客户端交互!
    使用WebDeployment Project改善VS2005发布网站问题 (一) 基础
    MSN改密码
    Ajax学习(一)
    Visual Studio2005 + Visual SourceSafe 2005 实现团队开发、源代码管理、版本控制
    手把手教你如何配置和编译ogre 1.7.0 + cegui 0.7.1
    What's Coming in the June 2010 DirectX SDK
    黄仁勋:相信你正在做的事。
    [转载] 翻译 西川善司著针对3D游戏爱好者的”METAL GEAR SOLID 4”图形讲座(下)
    glPushAttrib里的各个BIT都save了些什么
  • 原文地址:https://www.cnblogs.com/apanda009/p/7580690.html
Copyright © 2011-2022 走看看