电话号码分身

题目描述

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

输入描述:

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

输出描述:

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

示例1

输入

4
EIGHT
ZEROTWOONE
OHWETENRTEO
OHEWTIEGTHENRTEO

输出

0
234
345
0345

 

先将整个字符串离散成26个字母,存在数组A中,表示每个字母出现的次数,比如在ZERO中字母Z在0-9的英文中只出现一次,那么Z的个数就是0的个数,将Z的个数存在B[0]中,表示0出现的次数,在A数组中的Z,E,R,O里减去Z的个数,在依照这种思路将剩余的数字找完。

#include<iostream>
#include<algorithm> 
#include<cstdio>
#include<queue>
#include<cstring>
#include<string>
using namespace std;
int A[28];
int B[10];
int C[10]={2,3,4,5,6,7,8,9,0,1}; 
int main(){
	int T;
	scanf("%d",&T);
	while(T--){
		string s;
		priority_queue<int,vector<int>,greater<int> > q;
		memset(A,0,sizeof(A));
		memset(B,0,sizeof(B));
		cin>>s;
		for(int i=0;i<s.size();i++)
		  	A[s[i]-'A'+1]++;
		if(A[26]>0){
			B[0]=A[26];  A['E'-'A'+1]-=A[26]; A['R'-'A'+1]-=A[26]; A['O'-'A'+1]-=A[26]; A[26]-=A[26];
		} 	
		if(A['W'-'A'+1]>0){
			B[2]=A['W'-'A'+1]; A['T'-'A'+1]-=B[2]; A['O'-'A'+1]-=B[2]; A['W'-'A'+1]-=B[2];
		}
		if(A['X'-'A'+1]>0){
			B[6]=A['X'-'A'+1]; A['S'-'A'+1]-=B[6]; A['I'-'A'+1]-=B[6]; A['X'-'A'+1]-=B[6];
		} 
		if(A['G'-'A'+1]>0){
			B[8]=A['G'-'A'+1]; A['E'-'A'+1]-=B[8]; A['I'-'A'+1]-=B[8]; A['G'-'A'+1]-=8; A['H'-'A'+1]-=B[8]; A['T'-'A'+1]-=B[8]; 
		}
		if(A['S'-'A'+1]>0){
			B[7]=A['S'-'A'+1]; A['S'-'A'+1]-=B[7]; A['E'-'A'+1]-=(2*B[7]); A['V'-'A'+1]-=B[7]; A['N'-'A'+1]-=B[7];
		}
		if(A['V'-'A'+1]>0){
			B[5]=A['V'-'A'+1]; A['F'-'A'+1]-=B[5]; A['I'-'A'+1]-=B[5]; A['V'-'A'+1]-=B[5]; A['E'-'A'+1]-=B[5];
		}
		if(A['F'-'A'+1]>0){
			B[4]=A['F'-'A'+1]; A['F'-'A'+1]-=B[4]; A['O'-'A'+1]-=B[4]; A['U'-'A'+1]-=B[4]; A['R'-'A'+1]-=B[4];
		}
		if(A['O'-'A'+1]>0){
			B[1]=A['O'-'A'+1]; A['O'-'A'+1]-=B[1]; A['N'-'A'+1]-=B[1]; A['E'-'A'+1]-=B[1];
		} 
		if(A['T'-'A'+1]>0){
			B[3]=A['T'-'A'+1]; A['T'-'A'+1]-=B[3]; A['H'-'A'+1]-=B[3]; A['R'-'A'+1]-=B[3]; A['E'-'A'+1]-=(2*B[3]);
		}
		if(A['N'-'A'+1]>0){
			B[9]=A['N'-'A'+1]/2; A['N'-'A'+1]-=(2*B[9]); A['I'-'A'+1]-=B[9]; A['E'-'A'+1]-=B[9];
		}
		for(int i=0;i<10;i++){
			if(B[i]){
				for(int j=0;j<B[i];j++){
					q.push(C[i]);
				}
			}
		}
		while(!q.empty()){
			int a=q.top();  q.pop();
			cout<<a;
		}
		cout<<endl;
	}
} 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值