这道题的关键是前两条规则,合并成一句话就是字母以ASCII码从小到大排序,并且不区分大小写,同时要求按照输入顺序排列(即排序是稳定的!)解决方案有两种

  • 遍历字符串,StringBuilder拼接字符串中字母,转为charArray做稳定排序(如冒泡,判断条件改为同时转为大写或小写判断大写),最后遍历拼接最终字符串。
  • 遍历字符串,将字母放入list集合,利用Collections.sort方法+自定义比较器完成排序,最后遍历拼接最终字符串。
import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            String str = sc.nextLine();
            String res = sortStr(str);
            System.out.println(res);
        }
    }

    private static String sortStr(String str){
        //将所有字母加入集合
        List<Character> list = new ArrayList<>();
        for(int i=0; i<str.length(); i++){
            char c = str.charAt(i);
            if((c>='a'&&c<='z') || (c>='A'&&c<='Z')){
                list.add(c);
            }
        }
        //按照规则排序,也可以自己写一个稳定的排序算法!
        Collections.sort(list, new Comparator<Character>(){
            public int compare(Character a, Character b){
                return Character.toLowerCase(a)-Character.toLowerCase(b);
            }
        });
        //拼接结果
        StringBuilder sb = new StringBuilder();
        int index=0;
        for(int i=0; i<str.length(); i++){
            char c = str.charAt(i);
            if((c>='a'&&c<='z') || (c>='A'&&c<='Z')){
                sb.append(list.get(index));
                index++;
            }else{
                sb.append(c);
            }
        }
        return sb.toString();
    }
}