题解 | #字符串排序#
字符串排序
https://www.nowcoder.com/practice/5190a1db6f4f4ddb92fd9c365c944584
以示例为例
原字符串为
A Famous Saying: Much Ado About Nothing (2012/8).
遍历一次的过程中
使用一个队列存入 非字母字符的 下标和值, 便于后续还原
[
1, ' ', 8, ' ', 15, ':', 16, ' ',
21, ' ', 25, ' ', 31, ' ', 39, ' ',
40, '(', 41, '2', 42, '0', 43, '1',
44, '2', 45, '/', 46, '8', 47, ')',
48, '.'
]
使用一个数组存储每个字母的 排列?不知道怎么表达,看例子:
[
'AaaAA', 'b', 'c', 'd',
'', 'F', 'gg', 'hh',
'ii', '', '', '',
'mM', 'nNn', 'oooo', '',
'', '', 'sS', 'tt',
'uuu', '', '', '',
'y', ''
]
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
    const queue = []; // 使用一个队列存入 非字母字符的 下标和值, 便于后续还原
    const cnt = new Array(26).fill(""); // 使用一个数组存储每个字母的 排列
    while ((line = await readline())) {
        let chs = line.split("");
        for (let i = 0; i < chs.length; i++) {
            // 如果不是字母,将它在原来字符串中的 下标 和 值 入队
            if (/[^a-zA-Z]/.test(chs[i])) {
                queue.push(i);
                queue.push(chs[i]);
            } else if (/[A-Z]/.test(chs[i])) {
                // 大写字母 直接续到数组对应位置
                cnt[chs[i].charCodeAt(0) - 65] += chs[i];
            } else {
                // 小写字母 直接续到数组对应位置
                cnt[chs[i].charCodeAt(0) - 97] += chs[i];
            }
        }
        let res = cnt.join("").split("");
  		// 出队列来还原非字母字符的位置
        while (queue.length > 0) {
            let idx = queue.shift();
            let val = queue.shift();
            res.splice(idx, 0, val);
        }
        console.log(res.join(""));
    }
})();


