方法一 两层循环

  • 1、 不区分大小写排序,从a-z, 26轮外循环,每轮内循环拿出a或者A字符串,内循环使用charCodeAt() 比较ASCII码,以此类推
  • 2、 在循环将非大小写字母的字符按照原来的位置给塞进这个排好序的sorted数组。用数组的splice方法
let arr = readline().split("");
let res = "";
let len = arr.length;
let sorted = [];
for (let i = 0; i < 26; i++) {
  for (let j = 0; j < len; j++) {
    if (arr[j].charCodeAt() == 65 + i || arr[j].charCodeAt() == 97 + i) {
      sorted.push(arr[j]);
    }
  }
}

for (let i = 0; i < len; i++) {
  if (/[^a-zA-Z]/.test(arr[i])) {
      sorted.splice(i,0,arr[i])
  }
}

print(sorted.join(''));

方法二 桶排序

  • 1、 根据桶排序的原理 创新长度为26的数组,并填充为空值
  • 2 、 判断是a-z 还是A-Z,不论是大小写字母,通过减'a','A'的ASCII值,它们的差值都在26以内可以以数组下标对应上字母编号。
  • 3 同理,在排序后得到不区分大小写字母的数组中插入哪些非字母的符号
let arr = readline().split("");
let len = arr.length;

const sorted = new Array(26).fill('')

for(let s of arr){
    if(/[a-z]/.test(s)){
        sorted[s.charCodeAt() - 'a'.charCodeAt()] += s
    } else if(/[A-Z]/.test(s)){
        sorted[s.charCodeAt() - 'A'.charCodeAt()] += s
    }
}
let arr2 = sorted.join('').split('')

for(let i=0;i<len;i++){
    if(/[^A-Za-z]/.test(arr[i])){
        arr2.splice(i,0,arr[i])
    }
}

print(arr2.join(''));