【题解】凯撒密码

题意

给你一个字符串,将其中每个字符替换成对应的前第d个字符,例如d为2,c替换成a,d替换成b这样类推。这题包括数字大写小写字母。即以0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz的顺序进行偏移。

题解

我们可以创建一个模板字符串

char T[]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";

由于偏移操作可以认为是访问该模板字符串的下标,所以我们可以将其分成数字、大写字母、小写字母三部分。对于数字,我们减去'0'然后减去偏移量然后再加上62进行取模操作,就得到了其在模板串中的数组下标。然后大写字母减去'A'但是还要多加上一个10,表示前面的数字部分,再减去d再加上62进行取模。小写字母同样减去'a',但是要多加上一个36,表示前面的数字和大写字母部分。这样替换就能还原出原始串了

复杂度

时间复杂度
空间复杂度

代码

class Solution {
public:
    /**
     * 解密密文
     * @param str string字符串 密文
     * @param d int整型 偏移量
     * @return string字符串
     */
    string decode(string str, int d) {
        // write code here
        char T[]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
        string ans="";
        for(int i=0; i<str.length(); i++)
        {
        if(str[i]<='9'&&str[i]>='0')
            ans+=T[(str[i]-'0'-d+62)%62];
        else if(str[i]>='A'&&str[i]<='Z')
            ans+=T[(str[i]-'A'+10-d+62)%62];
        else
            ans+=T[(str[i]-'a'+36-d+62)%62];
        }
        return ans;
    }
};
全部评论

相关推荐

06-08 22:25
门头沟学院 Java
从零开始的转码生活:这hr不会打开手机不分青红皂白给所有人群发这句话,过一会再给所有人再发一遍,这肯定会有重复的,不管,再过一会再发一遍
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-09 11:30
找工作7个月,投了7000封,3段世界五百强实习,才有一个offer,牛油们肯定比我强吧
码农索隆:不对不对不对,实习经历这么厉害,简历也没少投,问题出在哪呢
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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