problem link: https://leetcode.com/problems/sort-characters-by-frequency/
note:
1.Java集合类priorityqueue优先队列,没用过所以想不到,还想自己写插入排序,Java现成的方法很方便
2.想到用桶排序的思想,但是由于考虑到string长度会不会太长以及中文字符的存在而放弃了
3.compare方法排序默认是升序
int compare(Object o1, Object o2) 返回一个基本类型的整型
如果要按照升序排序,
则o1 小于o2,返回-1(负数),相等返回0,01大于02返回1(正数)
如果要按照降序排序
则o1 小于o2,返回1(正数),相等返回0,01大于02返回-1(负数)
code:
1.(Java beat 34.76%) 集合priority queue ,hashmap
public class Solution {
public String frequencySort(String s) {
if(s.length()<3)
return s;
HashMap<Character, Integer> charMap = new HashMap<Character, Integer>();
for (char c : s.toCharArray()) {
if (charMap.containsKey(c)) {
charMap.put(c, (charMap.get(c) + 1));
} else {
charMap.put(c, 1);
}
}
PriorityQueue<Map.Entry<Character, Integer>> priorityQueue = new PriorityQueue<Map.Entry<Character, Integer>>(
new Comparator<Map.Entry<Character, Integer>>() {
@Override
public int compare(Map.Entry<Character, Integer> e1, Map.Entry<Character, Integer> e2) {
return e2.getValue() - e1.getValue();// 降序排列
}
});
priorityQueue.addAll(charMap.entrySet());
StringBuilder res = new StringBuilder();
// while (priorityQueue.size() > 0) {
while (!priorityQueue.isEmpty()) {
Map.Entry<Character, Integer> entry = priorityQueue.poll();
// poll方法和remove方法不同是remove会在优先队列是空的时候抛出异常,poll会返回null
for (int i = 0; i < entry.getValue(); i++) {
res.append(entry.getKey());
}
}
return res.toString();
}
}
2.桶排序