题目:
给定一个字符串,请将字符串里的字符按照出现的频率降序排列。
示例1:
输入: "tree"
输出: "eert"
解释: 'e'出现两次,'r'和't'都只出现一次。 因此'e'必须出现在'r'和't'之前。此外,"eetr"也是一个有效的答案。
解题思路:
本题是考查数据结构运用的模拟题。
1. 先使用哈希表对词频进行统计;
2. 遍历统计好词频的哈希表,将每个键值对对象以{字符,词频}的形式存储到大顶堆中。
3. 从大顶堆中依次弹出,构造答案字符串。
代码示例:
public String frequencySort(String s) {
char[] array = s.toCharArray();
StringBuilder res = new StringBuilder();
Map<Character, Integer> map = new HashMap<>();
for (int i = 0; i < array.length; i++) {
if (map.get(array[i]) == null)
map.put(array[i], 1);
else map.put(array[i], map.get(array[i]) + 1);
}
Set<Map.Entry<Character, Integer>> entries = map.entrySet();
Queue<Map.Entry<Character, Integer>> queue = new PriorityQueue<>(new Comparator<Map.Entry<Character, Integer>>() {
@Override
public int compare(Map.Entry<Character, Integer> o1, Map.Entry<Character, Integer> o2) {
return o2.getValue() - o1.getValue();
}
});
for (Map.Entry<Character, Integer> entry : entries) {
queue.offer(entry);
}
while (queue.peek() != null) {
Map.Entry<Character, Integer> entry = queue.poll();
char key = entry.getKey();
int value = entry.getValue();
while (value-- > 0)
res.append(key);
}
return res.toString();
}
|