题目:
Given a string, sort it in decreasing order based on the frequency of characters.
Example 1:
Input:
“tree”
Output:
“eert”
Explanation:
‘e’ appears twice while ‘r’ and ‘t’ both appear once.
So ‘e’ must appear before both ‘r’ and ‘t’. Therefore “eetr” is also a valid answer.
Example 2:
Input:
“cccaaa”
Output:
“cccaaa”
Explanation:
Both ‘c’ and ‘a’ appear three times, so “aaaccc” is also a valid answer.
Note that “cacaca” is incorrect, as the same characters must be together.
Example 3:
Input:
“Aabb”
Output:
“bbAa”
Explanation:
“bbaA” is also a valid answer, but “Aabb” is incorrect.
Note that ‘A’ and ‘a’ are treated as two different characters.
这道题读完题目后思路很明确,首先统计每个字符出现的次数,然后使用大顶堆存储字符和出现的次数。具体情况就看代码吧-^^-
public class SortCharactersByFrequency451 {
class Node {
int count;
char c;
public Node(int count, char c) {
this.count = count;
this.c = c;
}
}
public String frequencySort(String s) {
if(s == null || s.length() == 0) return "";
int[] map = new int[256];
for(char c : s.toCharArray()) map[c]++;
PriorityQueue<Node> pq = new PriorityQueue<Node>(10, new Comparator<Node>() {
@Override
public int compare(Node o1, Node o2) {
return o2.count - o1.count;
}
});
for(int i = 0; i < 256; i++) {
if(map[i] == 0) continue;
pq.add(new Node(map[i], (char)i));
}
StringBuilder sb = new StringBuilder();
while(!pq.isEmpty()) {
Node current = pq.poll();
for(int j = 0; j < current.count; j++)
sb.append(current.c);
}
return sb.toString();
}
}