本方法思路:
1)先将字母排序去重,放入数组;
2)遍历字符串,统计每个字母出现的此处,并放入对应的数组中;
3)利用冒泡排序的方法,将次数大的放到前面,次数相同的不变(字母第一步已排升序)
此方法较为繁琐,不推荐。
较为便捷的方法:
一、先找到最大的次数,之后逐渐-1,对应匹配字母
1)通过map,方便快速的统计字母,以及字母出现的次数,同时达到了去重的效果;
2)遍历找到出现的最大次数(此时并不知道对应的字母);
3)由最大次数逐次-1,遍历map,匹配次数。
此方法同样笨拙,还不如冒泡排序有思想。
二、将字母、次数放入map中,再将map放入list中,重写list的sort方法
1)通过map.put(key,map.getOrDefalut(key,0)+1)放入字母与次数;
2)通过List<Map.Entry> list=new ArrayList<>(map.entrySet),将map放入list中;
3)通过Collections.sort(list,new Comparator<Map.Entry>(){
public int compare(Map.Entry o1,Map.Entry o2){
if(o1.getValue()!=o2.getValue()) {return (int)o2.getValue()-(int)o1.getValue();}
else {return (char)o1.getKey()-(char)o2.getKey()}}})
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
String input=scan.nextLine();
String[] inputs=input.split("");
//将字母放入数组中,并按升序排列
String[] letters=Arrays.stream(inputs).distinct().sorted().toArray(String[]::new);
//对应升序字母,计算个数放入对应的数组
int[] amounts=new int[letters.length];
//遍历字符串
for(String item:inputs){
for(int i=0;i<letters.length;i++){
if(item.equals(letters[i])){
amounts[i]++;
break;
}
}
}
//采用类似冒泡排序的方法,将次数多的放前面,次数相同的不动 PS.同步移动次数和字母
for(int i=1;i<amounts.length;i++){
boolean flag=true;//判断是否发生排序
for(int j=0;j<amounts.length-i;j++){
if(amounts[j]<amounts[j+1]){
//次数变化顺序
int temp=amounts[j];
amounts[j]=amounts[j+1];
amounts[j+1]=temp;
flag=false;//表示发生排序动作
//字母同样变化顺序
String temp2=letters[j];
letters[j]=letters[j+1];
letters[j+1]=temp2;
}
}
if(flag) break;
}
//输出
System.out.println(String.join("",letters));
}
}

京公网安备 11010502036488号