题解 | 凯撒解密

凯撒解密

https://www.nowcoder.com/practice/42c2f0c1351e4a6689ff64eddaf97a37

凯撒密码解密的核心是通过 “字符 - 数字” 的映射转换,将字母的位移操作转化为可计算的数值运算,再利用模运算解决循环越界问题,最终还原出原始字符串。

具体实现逻辑可拆解为四步:

  1. 字符转数字映射:由于小写字母 a-z 的 ASCII 码是连续的(97-122),将每个字符减去 'a',即可把 a 对应为 0、b 对应为 1……z 对应为 25,把非数值的字母转化为 0-25 的整数,让 “左移 / 右移” 操作变成简单的加减运算。
  2. 解密核心运算:凯撒密码加密是将字符对应的数字 “右移 n 位”(即数值加 n),因此解密需反向操作 —— 将加密字符对应的数字 “左移 n 位”(即数值减 n)。
  3. 模运算修正越界:直接减 n 可能出现负数(如 a 对应 0,减 1 得到 -1),无法对应 0-25 的有效范围。此时先对结果% 26,将数值限制在 -25 到 25 之间;再加上 26 把负数转为正数,最后再次%26,双重保证结果落在 0-25 的有效区间内,解决循环越界问题。
  4. 数字转字符还原:将修正后的 0-25 数字加上 'a',即可把数值还原为对应的小写字母,最终将所有还原后的字母拼接,得到解密后的字符串。
  5. (自己写出来的依托
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;
    }
};

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务