步骤

  • 使用两个对象保存普通字符和特殊字符
  • 遍历字符串,将特殊字符的下标作为 key,字符作为值保存到对象 record1,将普通字符转化为小写,并且作为 key,其值作为一个数组,保持元素的大小写状态
  • 对 record2 进行排序,得到一个顺序正确的数组
  • 循环一次输入的字符串长度,依次取出普通字符串,在特殊字符下标相等的情况下取出特殊字符
  • 输出结果
while (input = readline()) {
  const record1 = {};
  const record2 = {};
  [...input].forEach((v, idx) => {
    if (/[^a-zA-Z]/.test(v)) {
      record1[idx] = v;
    } else {
      const key = v.toLowerCase();
      if (record2[key] === undefined) {
        record2[key] = [v];
      } else {
        record2[key] = [...record2[key], v];
      }
    }
  });

  let arr = Object.entries(record2);
  arr.sort((a, b) => (a[0] < b[0] ? -1 : 1));
  arr = arr.reduce((init, cur) => {
    return init.concat(cur[1]);
  }, []);
  let res = '';
  let arrIdx = 0;
  for (let i = 0; i < input.length; i++) {
    res += record1[i] !== undefined ? record1[i] : arr[arrIdx++];
  }
  console.log(res);
}