刷题:华为机试 HJ36 字符串加密

如果使用大小写转换函数,显得更整洁、更不容易出错。
toupper将小写字母转化为大写字母;
tolower将大写字母转化为小写字母。

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;

int main()
{
    string key;
    string str;
    while (cin >> key)
    {
        //保证key原来字母顺序不变的情况下,进行去重;
        for (int i = 0; i < key.length()-1; i++)
        {
            for (int j = i+1; j < key.length(); j++)
            {
                if (key[i] == key[j])
                {
                    key[j] = '0';
                }
            }
        }
        for (int i = 0; i < key.length(); i++)
        {
            if (key[i] == '0')
            {
                key.erase(key.begin()+i);
                i = i - 1; //因为erase函数删除一个元素后,后续的字符都向前移动了一个位置
                           //所以i的值减去1(i++会加回来),才能保证下次是从删除的那个字符的下一个字符开始判断
            }
        }

        //将去重后的单词放入字母表中
        string letter2="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        string letter3="ABCDEFGHIJKLMNOPQRSTUVWXYZ";

        for (int i = 0; i < key.length(); i++)
        {
            if (key[i] >= 'a' && key[i] <= 'z')
            {
                key[i] = key[i] - 32;//key数组所有字母转换为大写字母
            }
        }
        for (int i = 0; i < key.length(); i++)
        {
            letter2[i] = key[i];
        }
//        cout << endl;

        for (int i = 0,j= key.length(); i < 26; i++)
        {
                if (key.find(letter3[i]) == string::npos)
                {
                    letter2[j++] = letter3[i]; //进行加密
                }
        }

        //输入要加密的字符串进行处理
        cin >> str;
        vector<int> save;
        vector<int> flag;
        for (int i = 0; i < str.length(); i++)
        {
            if (str[i] >= 'a' && str[i] <= 'z')
            {
                str[i] -= 32;
                flag.push_back(1);
            }
            else
                flag.push_back(0);;
            if (letter3.find(str[i]) != string::npos)
            {
                save.push_back(letter3.find(str[i]));
            }   
        }

        for (int i = 0; i < save.size(); i++)
        {
            if (flag[i]==1)
            {
//                letter2[save[i]] += 32;
                letter2[save[i]] = tolower(letter2[save[i]]);
                cout << letter2[save[i]];
            }
            else
                cout << letter2[save[i]];
        }
        cout << endl;
    }
    return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值