Leecode 451字符串频率

209 阅读1分钟

这道题很简单,秒选哈希表(虽然时间复杂度比较高,这个之后讲),但是写的时候才想起来HashMap只能对Key进行排序,算是借着这个小题提醒下自己。可以先把Map专成List,然后就能用Collections的sort方法实现个匿名内部类就好了。

image.png

class Solution {
    public String frequencySort(String s) {
        HashMap<Character,Integer> map = new HashMap<>();
        String res = "";
        char[] cs = s.toCharArray();
        for(Character c:cs){
            int frequency = map.getOrDefault(c,0)+1;
            map.put(c,frequency);
        }
        List<Map.Entry<Character,Integer>> list =  new ArrayList<>(map.entrySet());
        Collections.sort(list,new Comparator<Map.Entry<Character,Integer>>(){
            public int compare(Map.Entry<Character,Integer> o1,Map.Entry<Character,Integer> o2){
                return o2.getValue()-o1.getValue();
            }
        });
        for(Map.Entry<Character,Integer> e:list) {
            for(int i=0;i<e.getValue();i++) {
                res+=(e.getKey()+"");
            }
        }
        return res;
    }
}

时间复杂度O(n+klogkn+klogk)

  • 首先一个for循环,把长度为n的字符串装进map里面,O(n);
  • Collections排序要O(klogk),其中k是不同字符的个数
  • 最后组合字符串O(n) 空间复杂度O(n+k) 只要包括哈希表,数组,结果字符串的空间

题解还有包括通排序等更优方法,这里不再赘述