题目:
给定一个字符串,请将字符串里的字符按照出现的频率降序排列。
示例 1:
输入:
"tree"
输出:
"eert"
解释:
'e'出现两次,'r'和't'都只出现一次。
因此'e'必须出现在'r'和't'之前。此外,"eetr"也是一个有效的答案。
示例 2:
输入:
"cccaaa"
输出:
"cccaaa"
解释:
'c'和'a'都出现三次。此外,"aaaccc"也是有效的答案。
注意"cacaca"是不正确的,因为相同的字母必须放在一起。
示例 3:
输入:
"Aabb"
输出:
"bbAa"
解释:
此外,"bbaA"也是一个有效的答案,但"Aabb"是不正确的。
注意'A'和'a'被认为是两种不同的字符。
算法步骤:
- 哈希表存储每一个字符出现的频率
- 优先队列按照出现频率从大到小排序
- 遍历队列
class Solution {
public String frequencySort(String s) {
//1.哈希表存储每一个字符出现的频率
Map<Character,Integer> map = new HashMap<>();
for(char c:s.toCharArray()){
map.put(c,map.getOrDefault(c,0)+1);
}
//2.优先队列按照出现频率从大到小排序
PriorityQueue<Map.Entry<Character,Integer>> queue = new PriorityQueue<>((a,b)->b.getValue()-a.getValue());
queue.addAll(map.entrySet());
//3.遍历队列
StringBuilder sb = new StringBuilder();
while(!queue.isEmpty()){
Map.Entry<Character,Integer> cur = queue.poll(); //获取到每一个字母及其对应的频率
int t = cur.getValue();
while(t-->0){
sb.append(cur.getKey());
}
}
return sb.toString(); //返回值要求是String类型,所以要做toString()
}
}
注:
toCharArray():
String s;
char a[]=s.toCharArray();将字符串对象中的字符转换为一个字符数组。
Map.Entry:
Map.Entry是为了更方便的输出map键值对。一般情况下,要输出Map中的key 和 value 是先得到key的集合
keySet(),然后再迭代(循环)由每个key得到每个value。values()方法是获取集合中的所有值,不包含键,
没有对应关系。而Entry可以一次性获得这两个值。
map.entrySet():
entrySet是 java 中键值对的集合,Set里面的类型是Map.Entry,一般可以通过map.entrySet()得到
entrySet实现了Set接口,里面存放的是键值对。一个K对应一个V。
StringBuilder:
String内容是不可变的,StringBuilder内容是可变的
// string转换成StringBuilder
String str = "hello";
StringBuilder sb = new StringBuilder(str);
// StringBuilder转换成String
String s = sb.toString();
sb.append():追加到序列
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sort-characters-by-frequency
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。