题解 | #字符串排序#

字符串排序

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(""));
    }
})();

全部评论

相关推荐

03-29 12:10
门头沟学院 C++
挣K存W养DOG:散漫消极者淘汰,一眼坑爹。实习几个月转正的时候说你加班太少,能力还行态度不够积极裁了,马上老实。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务