笔试-根据字符串出现频率排序
https://leetcode.cn/problems/sort-characters-by-frequency/description/
给定一个字符串 s ,根据字符出现的 频率 对其进行 降序排序 。一个字符出现的 频率 是它出现在字符串中的次数。
返回 已排序的字符串 。如果有多个答案,返回其中任何一个。
示例 1:
输入: s = "tree"
输出: "eert"
解释: 'e'出现两次,'r'和't'都只出现一次。因此'e'必须出现在'r'和't'之前。此外,"eetr"也是一个有效的答案。
示例 2:
输入: s = "cccaaa"
输出: "cccaaa"
解释: 'c'和'a'都出现三次。此外,"aaaccc"也是有效的答案。注意"cacaca"是不正确的,因为相同的字母必须放在一起。
示例 3:
输入: s = "Aabb"
输出: "bbAa"
解释: 此外,"bbaA"也是一个有效的答案,但"Aabb"是不正确的。注意'A'和'a'被认为是两种不同的字符。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
| public class Main {
public static void sortDesc(String str){
Map<Character, Integer> countMap = new HashMap<>();
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if (countMap.containsKey(c)){
Integer integer = countMap.get(c);
countMap.put(c,integer + 1);
}else {
countMap.put(c, 1);
}
}
Map<Character, Integer> sortMap = new LinkedHashMap<>();
countMap.entrySet()
.stream()
// 倒序
.sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
.forEachOrdered(i -> sortMap.put(i.getKey(), i.getValue()));
// 所有字符
Set<Character> characters = sortMap.keySet();
char[] res = new char[str.length()];
int i = 0;
for (char c : characters){
int count = sortMap.get(c);
for (int j = 0; j < count; j++) {
res[i] = c;
i++;
}
}
System.out.println(String.valueOf(res));
}
public static void main(String[] args) {
sortDesc("tree");
sortDesc("cccaaa");
sortDesc("Aabb");
}
}
|