Sort Characters By Frequency
Given a string s, sort it in decreasing order based on the frequency of the characters. The frequency of a character is the number of times it appears in the string.
Return the sorted string. If there are multiple answers, return any of them.
Example 1:
Input: s = “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: s = “cccaaa”
Output: “aaaccc”
Explanation: Both ‘c’ and ‘a’ appear three times, so both “cccaaa” and “aaaccc” are valid answers.
Note that “cacaca” is incorrect, as the same characters must be together.
Example 3:
Input: s = “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.
Constraints:
1 <= s.length <= 5 * 105
s consists of uppercase and lowercase English letters and digits.
//已AC代码,
想法:首先将每个字符出现次数及字符放入map
然后将map的value排序,拿到最大的出现次数后遍历map获取与之对应的第一个字符,
按出现次数将字符放入结果sortStr中;
public String frequencySort(String s) {
StringBuffer sortStr = new StringBuffer();
Map<Character, Integer> map = new HashMap<>();
//记录给定字符串中各个字符出现次数
for (int i = 0; i < s.length(); i++) {
if (map.containsKey(s.charAt(i))) {
map.put(s.charAt(i), map.get(s.charAt(i)) + 1);
} else {
map.put(s.charAt(i), 1);
}
}
//对出现次数进行降序排序
List<Integer> list = new ArrayList<Integer>(map.values());
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
});
//遍历map,找到最高出现频率的字符并放入结果字符串中
while (!list.isEmpty()) {
for (Map.Entry<Character, Integer> entry : map.entrySet()) {
if (list.get(0) == entry.getValue()) {
for (int j = list.get(0); j > 0; j--){
sortStr.append(entry.getKey());//将字符按出现频率放入结果字符串
}
list.remove(0);//移除已经加入结果字符串的频率数值
map.remove(entry.getKey());//移除已经加入结果字符串的字符
break;
}
}
}
return sortStr.toString();
}