题目链接:
解题思路[哈希表统计次数+优先队列]:
- 定义HashMap<Character, Integer>, 用于统计原字符串中, 字符(key)出现的次数(value);
- 定义优先队列, 并设置该优先队列的排序按照Entry.getValue()的值来比较, 出现次数多的字符优先级高, 排在队首;
- 遍历优先队列, 组装返回String;
实现代码:
class Solution {
public String frequencySort(String s) {
//1. 统计各个字符的个数
Map<Character, Integer> container = new HashMap<>();
for(int i = 0; i< s.length(); i++){
Integer count = container.get(s.charAt(i));
if (null == count || 0 == count) {
container.put(s.charAt(i), 1);
} else {
container.put(s.charAt(i), count + 1);
}
}
//2. 定义优先队列
PriorityQueue<Map.Entry<Character, Integer>> pq = new PriorityQueue((o, t1) -> {
Map.Entry<Character, Integer> o2 = (Map.Entry<Character, Integer>) o;
Map.Entry<Character, Integer> t2 = (Map.Entry<Character, Integer>) t1;
return t2.getValue().compareTo(o2.getValue());
});
pq.addAll(container.entrySet()); //将key-val放入优先队列
//3. 遍历优先队列并组装输出
StringBuilder sb = new StringBuilder();
while (!pq.isEmpty()) {
Map.Entry<Character, Integer> entry = pq.poll();
for (int i = 0; i < entry.getValue(); i++) {
sb.append(entry.getKey());
}
}
return sb.toString();
}
}
提交记录[20210703]:
执行用时:25 ms, 在所有 Java 提交中击败了25.11%的用户
内存消耗:39.4 MB, 在所有 Java 提交中击败了49.64%的用户
不纠结....