算法思路
该题要求完成字符串的加密和解密操作,主要应用 字符分类代换 和相对的规则。
1. 加密规则
- 英文字母:字母后移一位并切换大小写:
- 如:
a
给出为B
,Z
给出为a
。
- 如:
- 数字:数字值加一,如
0
变成1
,9
回到0
。 - 其他字符:不作变化。
2. 解密规则
- 加密的逆过程:
- 英文字母前移一位并切换大小写:
B
变回a
,a
变回Z
。 - 数字值减一:
1
变回0
,0
回到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)