天天看點

華為筆試:字元串加密

題目描述

有一種技巧可以對資料進行加密,它使用一個單詞作為它的密匙。下面是它的工作原理:首先,選擇一個單詞作為密匙,如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。

請實作下述接口,通過指定的密匙和明文得到密文。

較長的描述:

接口說明

原型:

voidencrypt(char * key,char * data,char * encrypt);

輸入參數:

char * key:密匙

char * data:明文

輸出參數:

char * encrypt:密文

傳回值:

void

輸入描述:

先輸入key和要加密的字元串

輸出描述:

傳回加密後的字元串

示例1

輸入

nihao

ni

輸出

le

解題思路:

1、定義字母表:string s=“abcdefghijklmnopqrstuvwxyz”

2、先将密鑰中重複字元去掉,得到s1;

3、将s1放入加密後的字母表前面,得到s2;

4、在s中尋找輸入的明文str出現的位置,在s2中尋找對應字母,存在s3中;

5、輸出s3

代碼:

#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int main()
{
    string key;
    string s="abcdefghijklmnopqrstuvwxyz";
    while(cin>>key)
    {
        string s1,s2,s3;//s1:去重後的密鑰。s2:加密後的字母表。s3:密文
        string str;//輸入的明文
        cin>>str;
        for(int i=0;i<key.length();i++)//輸入字元串去重
        {
            int n=s1.find(key[i]);
            if(n==-1)
            {
                s1+=key[i];
            }
        }
        //cout<<s1<<endl;
        s2+=s1;//将去重後的密鑰放到加密字母表的前面
        for(int i=0;i<s.length();i++)//構造加密字母表
        {
            int n=s2.find(s[i]);
            if(n==-1)
            {
                s2+=s[i];
            }
        }
        //cout<<s2<<endl;
        for(int i=0;i<str.length();i++)
        {
            int n=s.find(str[i]);
            s3+=s2[n];
        }
        cout<<s3<<endl;
    }
}
牛客網編譯器所有例子運作正确