【牛客网】电话号码分身

本文主要介绍牛客网上的一道题目——电话号码分身,详细阐述了题目的背景、输入输出要求,帮助读者理解并解决该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

继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

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#include<map>
using namespace std;
map<char,int>m;//每个字母出现次数
 map<int,int>m2;//每个数字出现次数 
 int a[15];//记录出现过的数,还原之后的数 
int main(){
	int t;
	string s;
	scanf("%d",&t);
	char c[14]={'E','F','G','H','I','N','O','S','Z','W','T','X','V','R'};//所有可能出现的字母 
	while(t--){
		for(int i=0;i<14;i++)
		m[c[i]]=0;//初始化 
	    cin>>s;
		for(int i=0;i<s.length();i++)
		++m[s[i]];

	
	memset(a,0,sizeof(a));
	int count=0;
	for(int i=0;i<=9;i++)
	m2[i]=0;
	m2[0]=m['Z'];
	m2[2]=m['W'];
	m2[6]=m['X'];
	m2[8]=m['G'];
	m2[3]=m['H']-m2[8];
	m2[7]=m['S']-m2[6];
	m2[5]=m['V']-m2[7];
	m2[4]=m['F']-m2[5];
	m2[1]=m['O']-m2[0]-m2[2]-m2[4];
	m2[9]=m['I']-m2[5]-m2[6]-m2[8];
	for(int i=0;i<=9;i++){
		if(m2[i]>0){
			++count;
			a[count]=i;
			if(i==8)
			a[count]=0;
			else if(i==9)
			a[count]=1;
			else
			a[count]=i+10-8;
		}
		else continue;	
	}

	sort(a+1,a+count+1);
	int sum;
	for(int i=1;i<=count;i++){
		if(a[i]==0)//注意还原成原来给的数 
		sum=8;
		else if(a[i]==1)
		sum=9;
		else
		sum=a[i]+8-10;
		for(int j=1;j<=m2[sum];j++)//出现多少次就输出多少次 
			printf("%d",a[i]);
	}	printf("\n");
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值