451. 根据字符出现频率排序
给定一个字符串,请将字符串里的字符按照出现的频率降序排列。
示例 1:
输入:
"tree"
输出:
"eert"
解释:
'e'出现两次,'r'和't'都只出现一次。
因此'e'必须出现在'r'和't'之前。此外,"eetr"也是一个有效的答案。
示例 2:
输入:
"cccaaa"
输出:
"cccaaa"
解释:
'c'和'a'都出现三次。此外,"aaaccc"也是有效的答案。
注意"cacaca"是不正确的,因为相同的字母必须放在一起。
示例 3:
输入:
"Aabb"
输出:
"bbAa"
解释:
此外,"bbaA"也是一个有效的答案,但"Aabb"是不正确的。
注意'A'和'a'被认为是两种不同的字符。
思路
1. 题意:根据字符出现频率从大到小排序,出现次数相同的字符顺序无所谓。
2. 方法:本题字符串范围为a-zA-Z0-9。由于排序是以频率优先,所以我们使用
标识值 = 出现次数*100 + 该字符编号
标识值除以100得到出现次数。
标识值模100得到字符编号。
定义一个数组存储标识值,下标0-25存储a-z,下标26-51存储A-Z,下标52-61存储0-9。排序后从后向前遍历标识值,若标识值小于100说明该字符未出现。
代码
class Solution {
public String frequencySort(String s) {
int[] count = new int[62];
for (int i = 0; i < 62; i++)
count[i] = i;
for (char c: s.toCharArray()) {
if (c >= 'a' && c <= 'z')
count[c - 'a'] += 100;
else if (c >= 'A' && c <= 'Z')
count[c - 'A' + 26] += 100;
else
count[c - '0' + 52] += 100;
}
Arrays.sort(count);
StringBuilder result = new StringBuilder();
for (int i = 61; i >= 0; i--) {
if (count[i] >= 100) {
if (count[i] % 100 > 51)
for (int j = 0; j < count[i] / 100; j++)
result.append((char) ('0' + count[i] % 100 - 52));
else if (count[i] % 100 > 25)
for (int j = 0; j < count[i] / 100; j++)
result.append((char) ('A' + count[i] % 100 - 26));
else
for (int j = 0; j < count[i] / 100; j++)
result.append((char) ('a' + count[i] % 100));
}
}
return result.toString();
}
}