题干:
给定一个字符串,请将字符串里的字符按照出现的频率降序排列。
public class 根据字符出现频率排序 {
public static void main(String[] args) {
String s = "Aabb";
System.out.println(frequencySort(s));
}
public static String frequencySort(String s) {
StringBuffer stringBuffer = new StringBuffer();
HashMap<Character,Integer> hashMap = new HashMap<>();
for(int i=0;i<s.length();i++){
hashMap.put(s.charAt(i),hashMap.getOrDefault(s.charAt(i),0)+1);
}
List<int[]> value = new ArrayList<>();
for (Map.Entry<Character,Integer> map:hashMap.entrySet()){
int Char = (int)map.getKey();
int Count = map.getValue();
value.add(new int[]{Char,Count});
}
qsort(value,0,value.size()-1);
for(int i=0;i<value.size();i++)
{
for(int j=0;j<value.get(i)[1];j++)
{
stringBuffer.append((char)value.get(i)[0]);
}
}
return stringBuffer.toString();
}
public static void qsort(List<int[]> value,int start,int end){
if(start<end) {
int pivot = (int)(Math.random()*(end-start+1))+start;
Collections.swap(value,pivot,start);
int i = start;
int base = value.get(start)[1];
for(int j=i+1;j<=end;j++) {
if(value.get(j)[1]>base){
Collections.swap(value,i+1,j);
i++;
}
}
Collections.swap(value,i,start);
qsort(value,start,i-1);
qsort(value,i+1,end);
}
else
return;
}
}
其实这题的思路和347.前K个高频元素基本一样,依然是先用hashmap存放各字母以及出现的频次,然后用一个链表(链表中每个元素是一个int数组,按{Char,Count}的形式存放每一个字母以及其对应的频次,这里是将字母的Ascii代替原本的字母)存放hashmap中的每一个映射关系,然后按频次进行快排就行了。注意一下快排判断start和end的关系,不然会栈溢出。