牛客网在线编程(4):电话号码分身-python

题目描述

继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.

你可能感兴趣的:(牛客网在线编程)