题解 | 字符串加密
字符串加密
https://www.nowcoder.com/practice/e4af1fe682b54459b2a211df91a91cf3?tpId=37&tqId=21259&rp=1&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D37&difficulty=undefined&judgeStatus=undefined&tags=&title=
#include<bits/stdc++.h>
using namespace std;
//将key转为大写
void to_upper(string& str){
for(int i = 0; i < str.size(); i++){
str[i] = toupper(str[i]);
}
}
//对key相同的字符只保留第一个
string remove_duplicates(const string& str) {
unordered_set<char> seen;
string result;
for (char c : str) {
if (seen.find(c) == seen.end()) {
seen.insert(c);
result += c;
}
}
return result;
}
//key后补A~Z中去除key中字符后的剩余字符
void add_A_to_Z(string& str){
string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
for (char c : alphabet) {
if (str.find(c) == string::npos) {
str += c;
}
}
}
//对字符串加密
void encryption(string& str, string& key){
for(int i = 0; i < str.size(); i++){
if(islower(str[i])){ //小写字符
int index = str[i] - 'a';
str[i] = tolower(key[index]);
}
else if(isupper(str[i])){ //大写字符
int index = str[i] - 'A';
str[i] = toupper(key[index]);
}
}
}
int main(){
string key; //秘钥
string str; //要加密的字符串
while(getline(cin, key) && getline(cin, str)){
map<char, int> freq; //存放key中各个字符的频率
to_upper(key); //将key转为大写
key = remove_duplicates(key); //对key相同的字符只保留第一个
add_A_to_Z(key); //key后补A~Z中去除key中字符后的剩余字符
encryption(str, key); //对字符加密
cout << str << endl;
}
return 0;
}
// 64 位输出请用 printf("%lld")
查看2道真题和解析