思路

  1. 按顺序收集字母,并放入26个“桶”中;
  2. 从前向后遍历 s
    • 若当前字符 c 不是字母,则保留该位置字符;
    • 若当前字符 c 是字母,则从“桶”中取出元素,并置于当前位置
import java.util.*;

public class Main {
    public static void main(String[] arags) {
        Scanner in = new Scanner(System.in);
        String s = in.nextLine();
        StringBuilder[] letters = new StringBuilder[26];
        // 初始化
        for (int i = 0; i < 26; i++) {
            letters[i] = new StringBuilder();
        }
        // 按顺序收集字母,并放入26个“桶”中
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (Character.isLetter(c)) {
                int index = Character.isUpperCase(c) ? c - 'A' : c - 'a';
                letters[index].append(c);
            }
        }
        // 遍历
        int letterIndex = 0;
        int index = 0;
        StringBuilder res = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (Character.isLetter(c)) {
                while (index >= letters[letterIndex].length()) {
                    letterIndex++;
                    index = 0;
                }
                res.append(letters[letterIndex].charAt(index++));
            } else {
                res.append(c);
            }
        }
        System.out.println(res);
        in.close();
    }
}