题解 | 字符串加密

字符串加密

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各个字符的频率
map<char, int> count_freq(string& str){
    map<char, int> m;
    for(int i = 0; i < str.size(); i++){
        if(m.find(str[i]) == m.end()){
            m.insert(pair<char, int>(str[i], 1));
        }
        else{
            m[str[i]]++;
        }
    }
    return m;
}
 
//对key相同的字符只保留第一个
string remove_duplicates(string& str, map<char, int>& m){
    string temp;
    for(int i = 0; i < str.size(); i++){
        if(m[str[i]] > 0){
            temp += str[i];
            m[str[i]] = 0;
        }
    }
    return temp;
}
 
//key后补A~Z中去除key中字符后的剩余字符
void add_A_to_Z(string& str){
    string temp = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    for(int i = 0; i < temp.size(); i++){
        if(str.find(temp[i]) == str.npos){
            str += temp[i];
        }
    }
}
 
//对字符串加密
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转为大写
        freq = count_freq(key);             //统计key各个字符的频率
        key = remove_duplicates(key, freq); //对key相同的字符只保留第一个
        add_A_to_Z(key);                    //key后补A~Z中去除key中字符后的剩余字符
        encryption(str, key);               //对字符加密
         
        cout << str << endl;
    }
     
    return 0;
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务