题解 | #字符串排序#
字符串排序
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("")); } })();