题目描述
继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
代码实现
import sys
from collections import Counter
def func():
num=[]
for i in range(10):
num.append((i+2)%10)
return num
lines = sys.stdin.readlines()
alpha=["ZERO", "ONE", "TWO", "THREE", "FOUR", "FIVE", "SIX", "SEVEN", "EIGHT", "NINE"]
for i in range(1,len(lines)):
Count=[0]*10
Map=Counter(lines[i].strip())
Count[0]=Map['Z']
Count[2]=Map['W']
Count[4]=Map['U']
Count[6]=Map['X']
Count[8]=Map['G']
Str=''
for i in range(0,10,2):
Str+=alpha[i]*Count[i]
Map-=Counter(Str)
Count[1]=Map['O']
Count[3]=Map['H']
Count[5]=Map['F']
Count[7]=Map['S']
Str=''
for i in range(1,9,2):
Str+=alpha[i]*Count[i]
Map-=Counter(Str)
Count[9]=Map['I']
num=func()
tup=sorted(zip(num,Count))
result=''
for i in range(10):
result+=str(i)*tup[i][1]
print(result)
原理说明
1.ZERO(Z)、TWO(W)、FOUR(U)、SIX(X)、EIGHT(G)分别具有独一无二的字母,所以可以先根据它们独一无二的字母的个数来统计它们的个数,比如有3个Z,那么一定有3个0.
2.去除已经在第一步使用过的字母,比如找到3个0,那么字符串里就要去掉3个Z,3个E,3个R和3个O,其它同理。
3.去除之后,ONE(O)、THREE(H)、FIVE(F)、SEVEN(S)分别就有了独一无二的数字,还按照上面的方法做就可以了。
4.最后剩下的字符串里的字母也就只能组成NINE了,这个就简单了,方法也很多了,比如统计I的个数。
5.所有的数字个数找到后,要进行一个转换(因为这些个数是经过加8处理的,要反处理回去),用示例中的func()就可以,原理很简单,大家可以自己想一下。
6.有了真实的数字的个数,输出就很简单了,直接小的在前,大的在后就可以了,比如2个0,1个1,直接输出001.