题解 | 凯撒解密
凯撒解密
https://www.nowcoder.com/practice/42c2f0c1351e4a6689ff64eddaf97a37
凯撒密码解密的核心是通过 “字符 - 数字” 的映射转换,将字母的位移操作转化为可计算的数值运算,再利用模运算解决循环越界问题,最终还原出原始字符串。
具体实现逻辑可拆解为四步:
- 字符转数字映射:由于小写字母
a-z的 ASCII 码是连续的(97-122),将每个字符减去'a',即可把a对应为 0、b对应为 1……z对应为 25,把非数值的字母转化为 0-25 的整数,让 “左移 / 右移” 操作变成简单的加减运算。 - 解密核心运算:凯撒密码加密是将字符对应的数字 “右移 n 位”(即数值加 n),因此解密需反向操作 —— 将加密字符对应的数字 “左移 n 位”(即数值减 n)。
- 模运算修正越界:直接减 n 可能出现负数(如
a对应 0,减 1 得到 -1),无法对应 0-25 的有效范围。此时先对结果% 26,将数值限制在 -25 到 25 之间;再加上 26 把负数转为正数,最后再次%26,双重保证结果落在 0-25 的有效区间内,解决循环越界问题。 - 数字转字符还原:将修正后的 0-25 数字加上
'a',即可把数值还原为对应的小写字母,最终将所有还原后的字母拼接,得到解密后的字符串。 - (自己写出来的依托
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 进行凯撒解密
* @param password string字符串 旺仔哥哥的密码
* @param n int整型 每个字符加密过程中错位的次数
* @return string字符串
*/
string decodeWangzai(string password, int n) {
// write code here
for(auto &c:password){
int c_num=c-'a';
int c_return=((c_num-n)%26+26)%26;
char e='a'+c_return;
c=e;
}
return password;
}
};
)
