Pintia题解——7-16 凯撒密码

7-16 凯撒密码

原题:

为了防止信息被别人轻易窃取,需要把电码明文通过加密方式变换成为密文。输入一个以回车符为结束标志的字符串(少于80个字符),再输入一个整数offset,用凯撒密码将其加密后输出。恺撒密码是一种简单的替换加密技术,将明文中的所有字母都在字母表上偏移offset位后被替换成密文,当offset大于零时,表示向后偏移;当offset小于零时,表示向前偏移。

输入格式:

输入第一行给出一个以回车结束的非空字符串(少于80个字符);第二行输入一个整数offset。

输出格式:

输出加密后的结果字符串。

.

解题思路:

  1. 引入readline模块并创建接口对象:首先将readline模块引入,并使用createInterface方法创建一个接口对象rl。该对象设置了输入流为标准输入。
  2. 读取输入并存储:通过监听'line'事件,将输入存储在数组buf中。
  3. 解析输入:将数组buf中的第一个元素赋值给变量str,将数组buf中的第二个元素解析为整数并赋值给变量offset
  4. 进行凯撒密码加密:使用扩展运算符将字符串str转换成字符数组,对每个字符进行映射转换。对于每个字符,首先获取其ASCII码,判断其是否为大写字母(65 ≤ code ≤ 90)或小写字母(97 ≤ code ≤ 122)。如果是大写字母,则根据凯撒密码算法,将字符偏移量offset应用到字符的ASCII码上,并将结果转换回字符。如果是小写字母,同样应用字符偏移量offset,并转换回字符。否则,保持字符不变。将映射后的字符数组使用join方法连接成字符串,赋值给变量res
  5. 输出加密结果:将加密后的字符串res输出。

.

JavaScript(node)代码:

const r = require("readline");
const rl = r.createInterface({
    
    
    input: process.stdin
});
let buf = [];
rl.on('line', (input) => buf.push(input));
rl.on('close', () => {
    
    
    let str = buf[0];
    let offset = parseInt(buf[1], 10);

    let res =[...str].map(i => {
    
    
            let code = i.charCodeAt(0);
            if (65 <= code && code <= 90) {
    
    
                return String.fromCharCode(((code - 65 + offset) % 26 + 26) % 26 + 65);
            } else if (97 <= code && code <= 122) {
    
    
                return String.fromCharCode(((code - 97 + offset) % 26 + 26) % 26 + 97);
            } else {
    
    
                return i;
            }
        }).join("");

    console.log(res);
	//测试点3尽力了,求大神题解
});

.

复杂度分析:

时间复杂度:O(n)
空间复杂度:O(n)

猜你喜欢

转载自blog.csdn.net/Mredust/article/details/133519431
今日推荐