LeetCode451. 根据字符出现频率排序(含详细Java解析)采用桶排序
题目描述
什么是桶排序
链接附上:https://blog.csdn.net/sinat_51673411/article/details/123586187?spm=1001.2014.3001.5501
步骤分析
- 遍历原始字符串,找到出现最大的次数值
- 创建大小为最多次数的StringBuffer数组
- 循环遍历 得到StringBuffer[3]=abc这样的各个StringBuffer对象
- 遍历输出
代码描述
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
String result = frequencySort("abcbcsadadagggg666666");
System.out.println(result);
}
static public String frequencySort(String s) {
// 遍历原始字符串,找到出现最大的次数值
Map<Character, Integer> map = new HashMap<Character, Integer>();
int maxFreq = 0;
int length = s.length();
for (int i = 0; i < length; i++) {
char c = s.charAt(i);
int frequency = map.getOrDefault(c, 0) + 1;
map.put(c, frequency);
maxFreq = Math.max(maxFreq, frequency);
}
// 创建大小为最多次数+1的桶数组 储存StringBuffer
// StringBuffer存储的是:例如出现次数为3次的元素有abc 则StringBuffer[3]=abc
StringBuffer[] buckets = new StringBuffer[maxFreq + 1];
for (int i = 0; i <= maxFreq; i++) {
buckets[i] = new StringBuffer();
}
// buckets下标值value 该下标所对应的值为次数 遍历map得到StringBuffer[3]=abc这样的各个StringBuffer对象
for (Map.Entry<Character, Integer> entry : map.entrySet()) {
//获得当前遍历的键key
char c = entry.getKey();
//获得当前遍历的键value,即是key出现的次数
int frequency = entry.getValue();
//buckets[出现的次数].append(当前遍历的字符) 可以看出来如果 b和c次数相同的话都会被加到一起
buckets[frequency].append(c);
}
// 输出
StringBuffer result = new StringBuffer();
// i表示出现的次数
for (int i = maxFreq; i > 0; i--) {
// bucket存储的是一个数字 这个数字代表的是buckets[i]的值
StringBuffer bucket = buckets[i];
// size表示的是含的字符个数
int size = bucket.length();
// 中间的循环遍历的是buckets[i]中所含的字符数
// j表示当前遍历的是bucket中的第j个字符
for (int j = 0; j < size; j++) {
// 最内层的循环遍历的是各字符输出的次数
for (int k = 0; k < i; k++) {
//bucket.charAt(j)=当前加入结果的字符
result.append(bucket.charAt(j));
}
}
}
return result.toString();
}
}
运行结果