课后自主练习(字符串)1049. 解密字符串 medium《编程思维与实践》个人学习笔记

题目

某人用一串非递减的数字字符表示一个密码(如:001,114,456779等),但经常忘记自己的密码,因此想把密码记录在某个地方。为防止泄密,将数码0到9用全大写的英文单词表示并将所有字母打乱。
例如:密码114表示为ONEONEFOUR,或者OURNEONFOE,FOOONNEERU等。

现在给定一个大写字母表示的字符串,要求算出原来的数字表示的密码。

输入数据保证答案唯一。

在这里插入图片描述

思路

考虑到每个英文数字唯一的字符,出现一个对应的字符就对应的字符--,对应的数字++,然后基数排序顺序输出即可

代码

#include<iostream>
#include<cstring>

using namespace std;

int alpha[130];
string number[10] = 
{   "ZERO","ONE","TWO",
    "THREE","FOUR",
    "FIVE","SIX",
    "SEVEN","EIGHT","NINE"
};
//0 Z
//1 除去其他数字 O
//2 W
//3 把0和4除掉就是R
//4 U
//5 除去4剩F
//6 X
//7 V 除去 5
//8 G
//9 与1差异是I

void trans(string str)
{
    memset(alpha,0,520);
    int NUM[10] = {0};

    int len = str.length();
    for(int i = 0; i < len; i++)
    {
        alpha[str[i]]++;
    }

    while(alpha['Z'])//0
    {
        alpha['Z']--;
        alpha['E']--;
        alpha['R']--;
        alpha['O']--;
        NUM[0]++;

    }
    while(alpha['W'])//2
    {
        alpha['T']--;
        alpha['W']--;
        alpha['O']--;
        NUM[2]++;
    }
    while(alpha['U'])//4
    {
        alpha['F']--;
        alpha['O']--;
        alpha['U']--;
        alpha['R']--;
        NUM[4]++;
    }
    while(alpha['F'])//5
    {
        alpha['F']--;
        alpha['I']--;
        alpha['V']--;
        alpha['E']--;
        NUM[5]++;
    }
    while(alpha['X'])//6
    {
        alpha['S']--;
        alpha['I']--;
        alpha['X']--;
        NUM[6]++;
    }
    while(alpha['V'])//7
    {
        alpha['S']--;
        alpha['E']--;
        alpha['V']--;
        alpha['E']--;
        alpha['N']--;
        NUM[7]++;
    }
    while(alpha['G'])//8
    {
        alpha['E']--;
        alpha['I']--;
        alpha['G']--;
        alpha['H']--;
        alpha['T']--;
        NUM[8]++;
    }
    while(alpha['I'])//9
    {
        alpha['N']--;
        alpha['I']--;
        alpha['N']--;
        alpha['E']--;
        NUM[9]++;
    }
    while(alpha['O'])//1
    {
        alpha['O']--;
        alpha['N']--;
        alpha['E']--;
        NUM[1]++;
    }
    while(alpha['R'])//1
    {
        alpha['T']--;
        alpha['H']--;
        alpha['E']-=2;
        alpha['R']--;
        
        NUM[3]++;
    }

    for(int i = 0; i < 10 ; i++)
    {
        while(NUM[i])
        {
            NUM[i]--;
            cout << i ;
        }
    }
    
}

int main()
{
    int t;
    cin >> t;
    for(int i = 0; i < t; i++)
    {
        string str;
        cin >> str;
        cout << "case #" << i << ":"<<endl;
        trans(str);
        cout << endl;
    }

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值