根据字符出现频率排序
给定一个字符串 s ,根据字符出现的 频率 对其进行 降序排序 。一个字符出现的 频率 是它出现在字符串中的次数。
链接:https://leetcode.cn/problems/sort-characters-by-frequency
- HashMap 统计每个字符出现的频率
tips:采用 getOrDefault 计数。若 map 不存在此key 则计数为0,存在则在原来的计数中加1
charFreqMap.put(c, charFreqMap.getOrDefault(c, 0) + 1);
- 优先级队列将字符入队列,比较器为:字符出现的频率。构造大顶堆
- 出队列,获取字符出现的次数,拼接结果。
public String frequencySort(String s) {
Map<Character, Integer> charFreqMap = new HashMap<>();
//记录每个字符出现的频率
for (int i = 0; i < s.length(); i++) {
Character c = s.charAt(i);
charFreqMap.put(c, charFreqMap.getOrDefault(c, 0) + 1);
}
//定义比较器: 按字符频率大小进行比较
Comparator<Character> comparator = (o1, o2) -> charFreqMap.getOrDefault(o2, 0).compareTo(charFreqMap.getOrDefault(o1, 0));
PriorityQueue<Character> pq = new PriorityQueue<>(comparator);
for (Map.Entry<Character, Integer> entry : charFreqMap.entrySet()) {
//将字符按频率大小放入优先级队列
pq.add(entry.getKey());
}
StringBuilder sb = new StringBuilder();
while (!pq.isEmpty()) {
Character c = pq.poll();
Integer freq = charFreqMap.get(c);
for (int i = 0; i < freq; i++) {
//重复出现的次数
sb.append(c);
}
}
return sb.toString();
}