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

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

浙公网安备 33010602011771号