华为机试题 HJ36题解 | #字符串加密#

字符串加密

https://www.nowcoder.com/practice/e4af1fe682b54459b2a211df91a91cf3

#include <cctype>
#include <iostream>
#include <string>
#include <algorithm>
#include <unordered_map>
#include <map>
using namespace std;

// 对字符串mingwen按照key进行加密,返回加密后的字符串
string Decrypt(string &key, const std::string &mingwen)
{
    string newKey = "";
    string miwen = "";
    // 将密钥key全部先转成小写字母
    std::transform(key.begin(), key.end(), key.begin(), ::tolower);
    unordered_map<char, int> chMap;
    char chStart = 'a';
    // 字母对照表map
    map<char, char> matchMap;
    for (auto ch : key) {
        if (isalpha(ch) && chMap.count(ch) == 0) {
            chMap[ch]++;
            newKey += ch;
            matchMap[chStart++] = ch;
        }
    }
    // 遍历字母表,如果不在key中则加入newKey之后,得到新字母表
    for (char ch1 = 'a'; ch1 <= 'z'; ch1++) {
        if (chMap.count(ch1) == 0) {
            newKey += ch1;
            matchMap[chStart++] = ch1;
        }
    }

    // 遍历明文字符串
    for (auto ch2 : mingwen) {
        bool isUpper = (ch2 >= 'A' && ch2 <= 'Z');
        char ch = ch2;
        if (isUpper) {
            ch = ::tolower(ch2);
        }
        // 从字典字母对照表中查找,如果找到,则替换成对应的字母
        auto jt = matchMap.find(ch);
        if (jt != matchMap.end()) {
            // 注意:明文中的字母大小写不变
            if (isUpper) {
                miwen += ::toupper(jt->second);
            } else {
                miwen += jt->second;
            }   
        } else {
            // 没找到,比如空格或者数字等非字母的,直接加上本身值,不变
            miwen += ch2;
        }
    }

    return miwen;
}

int main() {
    std::string key, mingwen;
    // while (cin >> key >> mingwen) { // 注意 while 处理多个 case
    //     cout << Decrypt(key, mingwen) << std::endl;
    // }
    while (getline(cin, key)) {
        getline(cin, mingwen);
        std::cout << Decrypt(key, mingwen) << std::endl;
    }

    return 0;
}

全部评论

相关推荐

程序员鼠鼠_春招版:我要12k吧我挂了,还招呢,天天被割,这点钱都不舍得出
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务