编写一个程序,将输入字符串中的字符按如下规则排序。
规则 1 :英文字母从 A 到 Z 排列,不区分大小写。
如,输入: Type 输出: epTy
规则 2 :同一个英文字母的大小写同时存在时,按照输入顺序排列。
如,输入: BabA 输出: aABb
规则 3 :非英文字母的其它字符保持原来的位置。
如,输入: By?e 输出: Be?y
我运行出来同一个英文字母的大小写同时存在时,只有第一个没有转换顺序,后三个还是转换顺序了,怎么改?
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
let arr = [];
rl.on("line", (line) => {
arr = line.split("");
// console.log(arr) ['A', ' ', 'F', 'a', 'm', 'o', 'u', 's',' ', 'S', 'a', 'y', 'i', 'n', 'g',':',' ', 'M', 'u', 'c', 'h', ' ', 'A', 'd','o', ' ', 'A', 'b', 'o', 'u', 't', ' ','N', 'o', 't', 'h', 'i', 'n', 'g', ' ','(', '2', '0', '1', '2', '/', '8', ')','.']
//类似于冒泡排序
for (let i = 0; i < arr.length; i++) {
for (let j = i + 1; j < arr.length; j++)
// 当两个字母都是大写或者都是小写时,比较ASCII码值
if (
(/[A-Z]/.test(arr[i]) && /[A-Z]/.test(arr[j])) ||
(/[a-z]/.test(arr[i]) && /[a-z]/.test(arr[j]))
) {
if (arr[i].charCodeAt() > arr[j].charCodeAt()) {
let temp = "";
temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}//当2个字母一大一小时
} else if (/[A-Z]/.test(arr[i]) && /[a-z]/.test(arr[j]) || /[a-z]/.test(arr[i]) && /[A-Z]/.test(arr[j])) {
//我的想法是当第i个元素的小写ASCII码值大于第j个的时,才调换顺序,但是运行出来只有第一个大小写的没有转换顺序
if(arr[i].toLowerCase().charCodeAt() > arr[j].toLowerCase().charCodeAt()){
let temp = "";
temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
}
console.log(arr.join(''))
});