问题描述

思路解析
- 由于这次有大小写字母和数字,所以直接使用ASCII表,128个桶来标记,其中使用的二维数组,第一个代表这个字符,第二个代表出现的频率
- 将字符串转换为字符串数字,方便使用增强for循环来简化代码
- 进行排序判断,如果出现频率不一样,那么频率高的排前面,如果一样,那么按照字符串升序排序(降序也可以,但是最好确定一种方式,不然复现的结构可能不一样)
- 使用StringBuilder 方便进行后续插入
代码
class Solution {
public String frequencySort(String s) {
int [][]cnt=new int[128][2];
//第一个数组代表的就是这个字符
for(int i=0;i<128;i++) cnt[i][0]=i;
for(char c:s.toCharArray()){
cnt[c][1]++;
}
Arrays.sort(cnt,(a,b)->{
return a[1]!=b[1]?b[1]-a[1]:a[0]-b[0];
});
StringBuilder sb=new StringBuilder();
for(int i=0;i<128;i++){
int k=cnt[i][1];
while(k-->0) sb.append((char)cnt[i][0]);
}
return sb.toString();
}
}