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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值