电话号码分身(小米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;
}