算法思路

该题要求完成字符串的加密和解密操作,主要应用 字符分类代换 和相对的规则。

1. 加密规则

  • 英文字母:字母后移一位并切换大小写:
    • 如:a 给出为 BZ 给出为 a
  • 数字:数字值加一,如 0 变成 19 回到 0
  • 其他字符:不作变化。

2. 解密规则

  • 加密的逆过程:
    • 英文字母前移一位并切换大小写:B 变回 aa 变回 Z
    • 数字值减一:1 变回 00 回到 9

3. 完成加密和解密

通过循环每个字符,根据规则定向加密或解密字符。创建一个新字符串,并返回结果。

Code

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

// 加密函数
function encrypt(str) {
    return str.split('').map(char => {
        if (/[a-z]/.test(char)) { // 小写英文字母
            return String.fromCharCode((char.charCodeAt(0) - 97 + 1) % 26 + 65); // 后移一位并切换大写
        } else if (/[A-Z]/.test(char)) { // 大写英文字母
            return String.fromCharCode((char.charCodeAt(0) - 65 + 1) % 26 + 97); // 后移一位并切换小写
        } else if (/[0-9]/.test(char)) { // 数字
            return (Number(char) + 1) % 10;
        } else { // 其他字符
            return char;
        }
    }).join('');
}

// 解密函数
function decrypt(str) {
    return str.split('').map(char => {
        if (/[a-z]/.test(char)) { // 小写英文字母
            return String.fromCharCode((char.charCodeAt(0) - 97 - 1 + 26) % 26 + 65); // 前移一位并切换大写
        } else if (/[A-Z]/.test(char)) { // 大写英文字母
            return String.fromCharCode((char.charCodeAt(0) - 65 - 1 + 26) % 26 + 97); // 前移一位并切换小写
        } else if (/[0-9]/.test(char)) { // 数字
            return (Number(char) - 1 + 10) % 10;
        } else { // 其他字符
            return char;
        }
    }).join('');
}

// 主函数,进行输入和输出
void async function () {
    const inputEncrypt = await readline(); // 待加密的字符串
    const inputDecrypt = await readline(); // 已加密的字符串

    console.log(encrypt(inputEncrypt)); // 输出加密结果
    console.log(decrypt(inputDecrypt)); // 输出解密结果
}();

复杂度分析

1. 时间复杂度

  • 加密和解密每次完成字符串的遍历,总计处理 个字符。因此,时间复杂度为:O(n)

2. 空间复杂度

  • 需要一个新字符串来存储加密或解密的结果,空间复杂度为:O(n)