华为机试题 HJ36 字符串加密

2023-02-26 16:34:21 浏览数 (1)

华为机试题 HJ36 字符串加密

题目描述:

代码语言:javascript复制
描述
    有一种技巧可以对数据进行加密,它使用一个单词作为它的密匙。下面是它的工作原理:
    首先,选择一个单词作为密匙,如TRAILBLAZERS。如果单词中包含有重复的字母,只保留第1个,
    将所得结果作为新字母表开头,并将新建立的字母表中未出现的字母按照正常字母表顺序加入新字母表。如下所示:
    A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

    T R A I L B Z E S C D F G H J K M N O P Q U V W X Y (实际需建立小写字母的字母表,此字母表仅为方便演示)

    上面其他用字母表中剩余的字母填充完整。在对信息进行加密时,信息中的每个字母被固定于顶上那行,
    并用下面那行的对应字母一一取代原文的字母(字母字符的大小写状态应该保留)。
    因此,使用这个密匙, Attack AT DAWN (黎明时攻击)就会被加密为Tpptad TP ITVH。

    请实现下述接口,通过指定的密匙和明文得到密文。

    数据范围:

    1≤n≤100  ,保证输入的字符串中仅包含小写字母

    输入描述:
    先输入key和要加密的字符串

    输出描述:
    返回加密后的字符串

    示例1
    输入:
    nihao
    ni

    输出:
    le

C 实现:

代码语言:javascript复制
#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<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;
}

0 人点赞