首页 > 试题广场 >

电话号码分身

[编程题]电话号码分身
  • 热度指数:23444 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
继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
#coding=utf-8
n=int(input())
di=[[['Z','ZERO',2],['W','TWO',4],['U','FOUR',6],['X','SIX',8],['G','EIGHT',0]], #查询字典,分2部分,'ZERO','TWO'等包含特定唯一字符'z','w'
    [['O','ONE',3],['R','THREE',5],['F','FIVE',7],['S','SEVEN',9]]]              #'ONE','THREE'去掉上面的唯一字符后,也只包含特定唯一字符'O','R'
for i in range(n):                                                               #最后只剩'NINE'需要特殊处理
    num=list(input()) #输入
    num.sort() #排序
    re=[]
    for j in range(2): #调用字典
        for d in di[j]: #字典内部遍历
            if d[0] in num: #是否包含特定唯一字符
                k=num.count(d[0]) #唯一特定字符个数就是代表数字个数,也是其他字母个数,如有k个'Z'就有k个'ERO'
                for d0 in d[1]:
                    s=num.index(d0)
                    del num[s:s+k] #删除k个'ZERO'
                re+=[d[2]]*k #代表的数字(减去8)
    re+=[1]*(int(len(num)/4)) #剩余都是NINE
    re.sort()#排序,找到最小的
    re=[str(i) for i in re]
    re=''.join(re)#组合
    print(re)
发表于 2020-08-05 22:47:27 回复(0)
T = int(input())
def transfer(s):
    out = []
    n0 = s.count('Z')    # 只有ZERO含有'Z'
    n2 = s.count('W')    # 只有TWO含有'W’
    n4 = s.count('U')    # 只有FOUR含有'U’
    n6 = s.count('X')    # 只有SIX含有'X'
    n8 = s.count('G')    # 只有EIGHT含有'G'
    n3 = s.count('H') - n8    # 含'H'的有EIGHT和THREE
    n5 = s.count('F') - n4    # 含'F'的有FIVE和FOUR
    n7 = s.count('S') - n6    # 含'S‘的有SIX和SEVEN
    n1 = s.count('O') - n0 - n2 - n4      # 含'O‘的有one、zero、two、four
    n9 = s.count('I') - n5 - n6 - n8     # 含'I‘的有nine、five、six、eight
    out.append('0'*n8+'1'*n9+'2'*n0+'3'*n1+'4'*n2+'5'*n3+'6'*n4+'7'*n5+'8'*n6+'9'*n7)
    return out
for i in range(T):
    fs = input()
    t = transfer(fs)
    print("".join(t))

发表于 2019-05-17 13:50:56 回复(0)
num = int(input())
for i in range(num):
    str = input()
    n0,n2,n4,n6,n8 = str.count('Z'),str.count('W'),str.count('U'),str.count('X'),str.count('G')
    n1,n3,n5=str.count('O')-n0-n2-n4,str.count('R')-n0-n4,str.count('F')-n4
    n7,n9=str.count('V')-n5,str.count('I')-n5-n6-n8 print('0'*n8 + '1'*n9 + '2'*n0 + '3'*n1 + '4'*n2 + '5'*n3 + '6'*n4 + '7'* n5 + '8'*n6 + '9'*n7)

发表于 2018-12-04 09:41:09 回复(0)
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[8] = s.count("G")
    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[3] = s.count("H") - result[8]
    t, resStr = "", ""  for i, r in enumerate(result):
        t += r * str(i) for i in t: if int(i) >= 8:
            resStr += str(int(i) - 8) else:
            resStr += str(int(i) + 10 - 8) return "".join(sorted(resStr))
n=int(input())
list=[0]* n for i in range(n):
    list[i]=originalDigits(input()) for i in list: print(i)

发表于 2018-09-25 23:15:40 回复(0)
T=int(input())
for i in range(T):
    s=input()
    #ZERO,TWO,FOUR,SIX,EIGHT均有独立的字母标识Z,W,U,X,G,且对应数字为2,4,6,8,0
    n2,n4,n6,n8,n0=s.count('Z'),s.count('W'),s.count('U'),s.count('X'),s.count('G')
    #去除上述单词后,ONE,THREE,FIVE,SEVEN可分别由O,T,F,S标识,且对应数字为3,5,7,9
    n3,n5,n7,n9=s.count('O')-n2-n4-n6,s.count('T')-n4-n0,s.count('F')-n6,s.count('S')-n8
    n1=s.count('I')-n7-n8-n0#最后剩余单词NINE由I标识,对应数字为1
    print('0'*n0+'1'*n1+'2'*n2+'3'*n3+'4'*n4+'5'*n5+'6'*n6+'7'*n7+'8'*n8+'9'*n9)

发表于 2018-06-29 10:47:05 回复(0)

感觉是一道数学题,暴力大法好!

```
N = int(input())
list_x = [input() for i in range(N)] 
for line in list_x:
    ans = ''  
    eight = line.count('G')
    zero = line.count('Z')
    two = line.count('W')
    four = line.count('U')
    six = line.count('X')
    seven = line.count('S')-six
    five = line.count('V')-seven
    one = line.count('O')-zero-two-four
    three = line.count('R')-zero-four
    nine = line.count('I')-eight-five-six
    ans = '0'*eight+'1'*nine+'2'*zero+'3'*one+'4'*two+'5'*three+'6'*four+'7'*five+'8'*six+'9'*seven  
    print(ans)

```

编辑于 2018-05-22 14:20:29 回复(0)

统计每个数字的出现次数,并存储在相对应的原数字的List中,之后顺序输出

import sys
def NumberChange(s):
    result = [0] * 10
    result[2] = s.count("Z")
    result[4] = s.count("W")
    result[6] = s.count("U")
    result[8] = s.count("X")
    result[0] = s.count("G")
    result[9] = s.count("S") - result[8]
    result[7] = s.count("V") - result[9]
    result[3] = s.count("O") - result[2] - result[6] - result[4]
    result[1] = (s.count("N") - result[3] - result[9]) // 2
    result[5] = s.count("H") - result[0]
    resultnum = ''
    for i, r in enumerate(result):
        resultnum += r * str(i)
    print(resultnum)


for i in sys.stdin.readlines():
    if i[0].isalpha():
        NumberChange(i.strip())
发表于 2018-03-19 09:37:58 回复(0)
    fromcollections importCounter
    n =int(raw_input())
    fori inrange(n):
        dic ={"ZERO": 0, "ONE": 0, "TWO": 0, "THREE": 0, "FOUR": 0,
           "FIVE": 0, "SIX": 0, "SEVEN": 0, "EIGHT": 0, "NINE": 0}
        dic1 =[["EIGHT", '0'], ["NINE", '1'], ["ZERO", '2'], ["ONE", '3'], ["TWO", '4'],
                ["THREE", '5'], ["FOUR", '6'], ["FIVE", '7'], ["SIX", '8'], ["SEVEN", '9']]
        S =Counter(raw_input())
        if'G'inS andS['G'] !=0:
            count =S['G']
            dic['EIGHT'] +=count
            fors in'EIGHT':
                S[s] -=count
        if'Z'inS andS['Z'] !=0:
            count =S['Z']
            dic['ZERO'] +=count
            fors in'ZERO':
                S[s] -=count
        if'H'inS andS['H'] !=0:
            count =S['H']
            dic['THREE'] +=count
            fors in'THREE':
                S[s] -=count
        if'U'inS andS['U'] !=0:
            count =S['U']
            dic['FOUR'] +=count
            fors in'FOUR':
                S[s] -=count
        if'W'inS andS['W'] !=0:
            count =S['W']
            dic['TWO'] +=count
            fors in'TWO':
                S[s] -=count
        if'O'inS andS['O'] !=0:
            count =S['O']
            dic['ONE'] +=count
            fors in'ONE':
                S[s] -=count
        if'X'inS andS['X'] !=0:
            count =S['X']
            dic['SIX'] +=count
            fors in'SIX':
                S[s] -=count
        if'S'inS andS['S'] !=0:
            count =S['S']
            dic['SEVEN'] +=count
            fors in'SEVEN':
                S[s] -=count
        if'F'inS andS['F'] !=0:
            count =S['F']
            dic['FIVE'] +=count
            fors in'FIVE':
                S[s] -=count
        if'I'inS andS['I'] !=0:
            count =S['I']
            dic['NINE'] +=count
            fors in'NINE':
                S[s] -=count
        s =''
        fori indic1:
            s +=dic[i[0]] *i[1]
        prints
编辑于 2018-02-21 20:33:31 回复(0)

这道题目是leetcode上的。小米抄袭过来稍加改造了一下,不过还是换汤不换药。

python解法献上:

import sys

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:
        if int(i) >= 8:
            resStr += str(int(i) - 8)
        else:
            resStr += str(int(i) + 10 - 8)
    return "".join(sorted(resStr))

for i in sys.stdin.readlines():
    if i[0].isalpha():
        print(originalDigits(i.strip()))
编辑于 2017-09-07 14:14:01 回复(7)
import sys
T=int(sys.stdin.readline())
a=[0 for i in range(10)]
for i in range(T):
    l=sys.stdin.readline()
    num=''
    a[2]=l.count('Z')
    a[4]=l.count('W')
    a[6]=l.count('U')
    a[8]=l.count('X')
    a[0]=l.count('V')
    a[5]=l.count('H')-a[0]
    a[7]=l.count('F')-a[6]
    a[9]=l.count('S')-a[8]
    a[3]=l.count('O')-a[2]-a[4]-a[6]
    a[1]=l.count('I')-a[7]-a[8]-a[0]
    for x in range(10):
        while a[x]>0:
            m=str(x)
            num.join(m)
            a[x]-=1
        print num
求解,每次多行输入我总是循环输出出错。但不知道错在哪,求大神指点。。说我输出为空
发表于 2017-08-26 00:13:24 回复(2)