2017-小米-电话号码分身

题目描述

继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


只有0(ZERO)有字母Z,也就是说,有多少个Z就有多少个0。同理,只有2有字母W,4有字母U,6有字母X,8有字母G。只有6和7有字母S,S的个数减去6的个数为7的个数。
同理,只有5和7有V等等。计算数字个数如下:
def originalDigits(s):
    result = [0] * 10
    result[0] = s.count("Z")
    result[2] = s.count("W")
    result[4] = s.count("U")
    result[6] = s.count("X")
    result[7] = s.count("S") - result[6]
    result[5] = s.count("V") - result[7]
    result[1] = s.count("O") - result[0] - result[4] - result[2]
    result[9] = (s.count("N") - result[1] - result[7]) // 2
    result[8] = s.count("I") - result[5] - result[6] - result[9]
    result[3] = s.count("H") - result[8]
    t, resStr = "", ""
    for i, r in enumerate(result):
        t += r * str(i)  # 将所有数字排成一排
    for i in t:  # 减8逆推回原数字,resStr为原数字
        if int(i) >= 8:
            resStr += str(int(i) - 8)
        else:
            resStr += str(int(i) + 10 - 8)
    return ''.join(sorted(resStr))  #原数字排序后(返回列表)jion为字符串
 
if __name__ == '__main__':
    N = int(input())
    for i in range(N):
        strNumber = input()
        print(originalDigits(strNumber))

 

posted @ 2018-05-23 17:01  Laumians  阅读(1227)  评论(0编辑  收藏  举报