题目描述
牛牛截获了一段由凯撒密码加密过的密文,凯撒密码指的是将字符偏移一定的单位,例如若偏移量为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; } };