题解 | #字符串加密#
字符串加密
http://www.nowcoder.com/practice/e4af1fe682b54459b2a211df91a91cf3
#include<iostream>
#include<string>
#include<algorithm>
#include<string.h>
using namespace std;
string jiami(string kss,string str){
int f[26]={0};
for(int i=0;i<kss.size();i++){
kss[i]=tolower(kss[i]);
}
string key="";
for(int i=0;i<kss.size();i++){
if(f[kss[i]-97]==0){
key.push_back(kss[i]);
f[kss[i]-97]=1;
}
}
for(int i='a';i<='z';i++){
if(f[i-97]==0){
key.push_back(i);
f[i-97]=1;
}
}
for(int j=0;j<str.size();j++){
if(isupper(str[j])){
str[j]=toupper(key[str[j]-65]);
}
else if(islower(str[j])){
str[j]=key[str[j]-97];
}
}
return str;
}
int main(){
string s1,s2;
while(cin>>s1>>s2){
cout<<jiami(s1,s2)<<endl;
}
return 0;
}
思路:
1.为了加快运算用例,将加密封装为一个字符串函数jiami(参数1,参数2),参数1代表key,参数2代表明文,返回值为密文;
2.为加密规则方便,将key中字母都转化为小写字母;
3.定义一个空字符串my来放密钥;
4.定义一个长度为26的数组f[26],用f[i]=1来表示字母char(i+97)已经存放进密钥,f[i]初始化为0表示未加入密钥;
5.遍历key,若f[key[i]]=0,将key[i]加入密钥字符串my中,并令f[key[i]]=1,这样便将key中不同的字符按顺序加入了密钥字符串my中;
6.为防止key中不包含全部字母,再让依次遍历字母a~z,若f[i-97]=0,再将字母i添入密钥字符串my中,这样操作完以后,密钥字符串my中有26个字母,按顺序分别就是从a到z加密后的字母的小写形式;
7.遍历明文,若字符str[j]是大写字母,my[str[j]-65]就是它加密后的小写字母,再用toupper()函数将它转化为大写字母形式, 若str[j]是小写字母,则my[str[j]-97]就是它加密后的字母,将加密结果赋值给原字符;
8.返回str,这时已经对它完成了加密操作;
9.写主函数读入key和明文,判断读入有效的话调用加密函数并输出jiami(key,str);