【题解】凯撒密码
题意
给你一个字符串,将其中每个字符替换成对应的前第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; } };