电话号码分身(小米2017秋招真题)

电话号码分身(小米2017秋招真题)

题目描述

继MIUI8推出手机分身功能之后,MIUI9计划推出一个电话号码分身的功能:首先将电话号码中的每个数字加上8取个位,然后使用对应的大写字母代替("ZERO", "ONE", "TWO", "THREE", "FOUR", "FIVE", "SIX", "SEVEN", "EIGHT", "NINE"),

然后随机打乱这些字母,所生成的字符串即为电话号码对应的分身。

输入

 

第一行是一个整数T(1<=T<=100)表示测试样例数;接下来T行,每行给定一个分身后的电话号码的分身(长度在3到10000之间)。

 

样例输入

 

4

EIGHT

ZEROTWOONE

OHWETENRTEO

OHEWTIEGTHENRTEO

输出

 

输出T行,分别对应输入中每行字符串对应的分身前的最小电话号码(允许前导0)。

 

样例输出

 

0

234

345

0345

步骤:

1.记录每个字母的个数

2.根据优先级(是否拥有标识字母、(num + 10 - 8)%10的大小)来存入vector内

3.容器排序后输出

#include<iostream>
#include<algorithm>
#include<string>
#include<map>
#include<string.h>
#include<vector>
using namespace std;
char s[10011];
int d[333];//字母数量
vector<int>number;
//根据存入对应数目的数字个数
void add(int num,int cnt){
    while(cnt--){
        number.push_back((num + 10 - 8)%10);
    }
}
//根据字符串组成字母,清除对应字母个数
void del(string ss,int cnt){
    for(int i=0;ss[i];i++){
        d[ss[i]]-=cnt;
    }
}
//遍历排除
int main(){
    int T;
    cin>>T;
    while(T--){
        scanf("%s",s);
        memset(d,0,sizeof(d));
        for(int i=0;s[i];i++){
            d[s[i]]++;
        }
        number.clear();
        //拥有标识自身的字母G,Z,W,U,X
        add(8,d['G']);    del("EIGHT",d['G']);//0
        add(0,d['Z']);    del("ZERO",d['Z']);//2
        add(2,d['W']);    del("TWO",d['W']);//4
        add(4,d['U']);    del("FOUR",d['U']);//6
        add(6,d['X']);    del("SIX",d['X']);//8
        //排除上述字母分别标识O,T,F,S
        add(1,d['O']);    del("ONE",d['O']);//3
        add(3,d['H']);    del("THREE",d['H']);//5
        add(5,d['F']);    del("FIVE",d['F']);//7
        add(7,d['S']);    del("SEVEN",d['S']);//9
        //排除上述8个才可标识
        add(9,d['I']);    del("NINE",d['I']);//1
        //排序
        sort(number.begin(),number.end());
        int len=number.size();
        for(int i=0;i<len;i++){
            printf("%d",number[i]);
        }
        printf("\n");
    }
    return 0;
}

 

posted @ 2020-03-21 21:09  aeipyuan  阅读(227)  评论(0编辑  收藏  举报