Leetcode451 Sort Characters By Frequency Java实现

首先想到用map来统计字符出现次数,然后要从map中按大小依次读出这些字符,肯定不能一外一内循环找最大的读,O(n^2)呢。于是能想到的解决方法:TreeMap

然后实施了一下TreeMap,发现因为要用map的value去排序,而TreeMap设计的是给key排序的,用Comparator也只能给key排序。于是作罢。感觉以后用comparator的都不靠谱…可以趁早试试别的方法了。

BucketSort,方法1:

 

class Solution {
    public String frequencySort(String s) {
        Map<Character,Integer> map = new HashMap<>();
        char[] letters = s.toCharArray();
        for(char l:letters) {
            if(map.containsKey(l)) {map.put(l, map.get(l)+1);}
            else {map.put(l, 1);}
        }
        List<Character>[] bucket = new ArrayList[s.length()+1];    //bucketsort:对出现频率进行bucketsort,每个频率上存一个list,用以存储这个频率的字母
        for (char k:map.keySet()) {
            int v = map.get(k);
            if(bucket[v]==null) bucket[v] = new ArrayList<>();
            bucket[v].add(k);
        }
        StringBuilder sb = new StringBuilder();
        for(int i=bucket.length-1;i>0;i--) {
            if(bucket[i]!=null) {
                for(char c:bucket[i]) {
                    for(int j=0;j<map.get(c);j++) {
                        sb.append(c);
                    }
                }
            }
        }
        return sb.toString();
    }
}

 然后翻看时发现了自己的原始思路的正确解法,利用PriorityQueue去做,方法2:

    public String frequencySort(String s) {
         Map<Character,Integer> map = new HashMap<>();
         char[] letters = s.toCharArray();
         for(char l:letters) {
             if(map.containsKey(l)) {map.put(l, map.get(l)+1);}
             else {map.put(l, 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<Character, Integer> e = pq.poll();
             for(int i=0;i<e.getValue();i++) sb.append(e.getKey());
         }
         return sb.toString();
         
    }

 还有大神的代码可看,以后回到这题了再看吧。

posted @ 2019-03-22 00:07  大胖子球花  阅读(180)  评论(0)    收藏  举报