【较难】算法nodeJs:字符串合并处理

136 阅读1分钟

描述

定义“调整”操作为,对于一个十进制数字,将其转换为二进制数,翻转,再转换为十六进制数(大写)。例如,(4)10​ 对应的二进制数为 (100)2​ ,翻转后得到 (001)2​ ,再转换为十六进制数为 (1)16​ 。

对于给定的仅由小写字母 a-f 、大写字母 A-F 、数字 0-9 构成的字符串 s 和 t ,请按照以下步骤进行处理:
∙第一步,将 s 和 t 合并,形成一个新字符串 u 。
∙第二步,将 u 中奇数位字符从小到大进行排序,随后将偶数位字符也从小到大进行排序,得到 u′ 。
∙第三步,对 u′ 中的字符依次转换为十进制数,随后执行“调整”操作。
输出最终的字符串。

输入描述:

在一行上输入两个长度 1≦length(s),length(t)≦100 ,仅由小写字母 a-f 、大写字母 A-F 、数字 0-9 构成的字符串 s 和 t ,代表待处理的字符串。

输出描述:

在一行上输出一个字符串,代表最终的字符串。

image.png

image.png

const rl = require("readline").createInterface({ input: process.stdin });

rl.on("line", (line) => {
    // 第一步
    const arr = line.replace(" ", "").split("");
    // 第二步
    const arr0 = arr.filter((x, i) => i % 2 === 0).sort();
    const arr1 = arr.filter((x, i) => i % 2 === 1).sort();
    const arr2 = [];
    for (let i = 0; i < arr0.length; i++) {
        arr2.push(arr0[i]);
        arr2.push(arr1[i]);
    }
    // 第三步
    const arr3 = arr2.map((x) => {
        if (/^[\da-fA-F]$/.test(x)) {
            return parseInt(
                parseInt(x, 16)
                    .toString(2)
                    .padStart(4, 0)
                    .split("")
                    .reverse()
                    .join(""),
                2
            )
                .toString(16)
                .toUpperCase();
        } else {
            return x;
        }
    });
    console.log(arr3.filter((x) => x).join(""));
});