这道题很简单,秒选哈希表(虽然时间复杂度比较高,这个之后讲),但是写的时候才想起来HashMap只能对Key进行排序,算是借着这个小题提醒下自己。可以先把Map专成List,然后就能用Collections的sort方法实现个匿名内部类就好了。
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()
- 首先一个for循环,把长度为n的字符串装进map里面,O(n);
- Collections排序要O(klogk),其中k是不同字符的个数
- 最后组合字符串O(n) 空间复杂度O(n+k) 只要包括哈希表,数组,结果字符串的空间