本方法思路:
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)); } }