题意:
1、对输入的字符串进行加解密,并输出。
2、加密方法为:
当内容是英文字母时则用该英文字母的后一个字母替换,同时字母变换大小写,如字母a时则替换为B;字母Z时则替换为a;
当内容是数字时则把该数字加1,如0替换1,1替换2,9替换0;
其他字符不做变化。
3、解密方法为加密的逆过程。
方法一:
直接模拟
思路:直接模拟。
加密:
如果是数字,则右移加一;如果是小写字母,则变为大写字母,并右移加一;
如果是大写字母,则变为小写字母,并右移加一。
解密:如果是数字,则左移减一;如果是小写字母,则变为大写字母,并左移减一;
如果是大写字母,则变为小写字母,并左移减一。
#include <bits/stdc++.h> using namespace std; int main(){ string s1,s2; while(cin >> s1 >> s2){//输入 int len1=s1.size(); for(int i=0;i<len1;i++){//遍历 if(isdigit(s1[i])){//如果是数字,则右移加一 s1[i]=s1[i]+1; if(s1[i]>'9') s1[i]='0'; }else{ if(s1[i]>='a'&&s1[i]<='z'){//如果是小写字母,则变为大写字母,并右移加一 s1[i]-=32; s1[i]=s1[i]+1; if(s1[i]>'Z') s1[i]='A'; }else{//如果是大写字母,则变为小写字母,并右移加一 s1[i]+=32; s1[i]=s1[i]+1; if(s1[i]>'z') s1[i]='a'; } } } cout << s1 << endl; int len2=s2.size(); for(int i=0;i<len2;i++){ if(isdigit(s2[i])){//如果是数字,则左移减一 s2[i]=s2[i]-1; if(s2[i]<'0') s2[i]='9'; }else{ if(s2[i]>='a'&&s2[i]<='z'){//如果是小写字母,则变为大写字母,并左移减一 s2[i]-=32; s2[i]=s2[i]-1; if(s2[i]<'A') s2[i]='Z'; }else{//如果是大写字母,则变为小写字母,并左移减一 s2[i]+=32; s2[i]=s2[i]-1; if(s2[i]<'a') s2[i]='z'; } } } cout << s2 << endl; } return 0; }
时间复杂度:空间复杂度:
方法二:
map
思路:定义两个映射map,分别实现加密和解密过程。
如图所示:
#include <bits/stdc++.h> using namespace std; string x1="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; string x2="1234567890BCDEFGHIJKLMNOPQRSTUVWXYZAbcdefghijklmnopqrstuvwxyza"; unordered_map<char,char> m1;//x1映射到x2 unordered_map<char,char> m2;//x2映射到x1 int main(){ string s1,s2; for(int i=0;i<62;i++){//映射初始化 m1[x1[i]]=x2[i]; m2[x2[i]]=x1[i]; } while(cin >> s1 >> s2){//输入 int len1=s1.size(); for(int i=0;i<len1;i++){//加密 s1[i]=m1[s1[i]]; } cout << s1 << endl; int len2=s2.size(); for(int i=0;i<len2;i++){//解密 s2[i]=m2[s2[i]]; } cout << s2 << endl; } return 0; }
时间复杂度:空间复杂度: