【中等】算法nodeJs:字符串排序

129 阅读1分钟

描述

对于给定的由可见字符和空格组成的字符串,按照下方的规则进行排序:
∙按照字母表中的顺序排序(不区分大小写);
∙同一字母的大小写同时存在时,按照输入顺序排列;
∙非字母字符保持原来的位置不参与排序;
直接输出排序后的字符串。

字符串由 ASCII 码在 32 到 126 范围内的字符组成。您可以参阅下表获得其详细信息。

/图片/可见字符集Asciipng

输入描述:

在一行上输入一个长度为 1≦length(s)≦1000 ,由上表中的字符组成的字符串 s 。

输出描述:

输出一个字符串,代表按照规则排序后的字符串。

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void (async function () {
    // Write your code here
    while ((line = await readline())) {
        handle(line);
    }
    function handle(str) {
        //提取所有字母并按不区分大小写顺序排序,同时保持相同字母大小写的顺序
        let letters = str
            .split("")
            .filter((i) => /[a-zA-Z]/.test(i))
            .sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()));

        let result = [];
        let letterIndex = 0;
        for (let i = 0; i < str.length; i++) {
            if (/[a-zA-Z]/.test(str[i])) {
                result.push(letters[letterIndex++]);
            } else {
                result.push(str[i]);
            }
        }
        console.log(result.join(""));
    }
})();