题目描述
牛牛截获了一段由凯撒密码加密过的密文,凯撒密码指的是将字符偏移一定的单位,例如若偏移量为2,则a替换为c,b替换为d,c替换为e,...,z替换为b。若加密nowcoder,则密文为pqyeqfgt。现在牛牛发现对方加密包括数字、大写字母、小写字母,即0-9、A-Z、a-z的排列顺序进行偏移,现在牛牛截获了对方的一段密文以及偏移量,你能帮助牛牛破解密文吗。即给定一段密文str和偏移量d,求对应的明文。

题目分析
这是一个堆字符串进行操作的题目,可以用map或者数组去做

方法一:map

class Solution {
public:
    /**
     * 解密密文
     * @param str string字符串 密文
     * @param d int整型 偏移量
     * @return string字符串
     */
    string decode(string str, int d) {
        char s[105];
        map<char, int> mp;
        for(int i = 0; i <= 9; i++) {
            s[i] = i + '0';
            mp[s[i]] = i;
        }
        for(int i = 10; i <= 35; i++) {
            s[i] = 'A' + i - 10;
            mp[s[i]] = i;
        }
        for(int i = 36; i <= 36 + 25; i++) {
            s[i] = 'a' + i - 36;
            mp[s[i]] = i;
        }
        for(int i = 0; i < str.size(); i++) {
            str[i] = s[(mp[str[i]] - d + 62) % 62];
        }
        return str;
    }
};

方法二:数组

class Solution {
public:
    /**
     * 解密密文
     * @param str string字符串 密文
     * @param d int整型 偏移量
     * @return string字符串
     */
    string decode(string str, int d) {
        int len=str.length();
        string s;
        string S="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
        map<char,int>M;
        for(int i=0;i<S.size();i++)M[S[i]]=i;
        for(int i=0;i<len;i++)s+=S[((M[str[i]]-d)+(S.size()))%S.size()];
        return s;
    }
};