题意:
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;
}
时间复杂度:
空间复杂度:![]()



京公网安备 11010502036488号