给定一个非空字符串,其中包含字母顺序打乱的英文单词表示的数字0-9。按升序输出原始的数字。
注意:
输入只包含小写英文字母。
输入保证合法并可以转换为原始的数字,这意味着像 “abc” 或 “zerone” 的输入是不允许的。
输入字符串的长度小于 50,000。
示例 1:
输入: “owoztneoer”
输出: “012” (zeroonetwo)
示例 2:
输入: “fviefuro”
输出: “45” (fourfive)
这是上周在华为实习生机测中遇到的一道题目,当时比较紧张,也没有认真思索,只是想到1,3,5,7,9这五个数字不能用唯一关键字表示,就放弃了沿着这一思路往下解题。而是没有考虑英文字母是乱序的,使用了以下解法,没记错的话很奇怪测试竟然达到了90%的正确率。
s = 'oNeonetwothree'
dict3 = {'zero':'0','one':'1','two':'2','three':'3','four':'4','five':'5','six':'6','seven':'7','eight':'8','nine':'9'}
b = s.lower()
dic = {}
out = ''
for i,j in dict3.items():
if i in s:
dic[j] = s.count(i)
for l,m in dic.items():
out = out + l * m
print(''.join(sorted(out)))
解题思路:
利用通过字典构建哈希表,0-9的数字的英文字母中0,2,4,6,8都能用唯一关键字‘z’,‘w’,‘u’,‘x’,'g’表示。剩下的1,3,5,7,9虽然不能用唯一键表示,但是在程序中,我们可以策略性地先将有唯一关键字的数字挑选出来,再在剩下的这5个数字英文里找关键字就可以了。
Python:
class Solution:
def originalDigits(self, s: str) -> str:
out = ''
dic = {}
hash1 = {'z':'zero','w':'two','u':'four','x':'six','g':'eight','o':'one','h':'three','f':'five','s':'seven','e':'nine'}
hash2 = {'z':'0','w':'2','u':'4','x':'6','g':'8','o':'1','h':'3','f':'5','s':'7','e':'9'}
for ch in s:
dic[ch] = dic.get(ch,0) + 1
for i,j in hash1.items():
n = dic.get(i,0)
if n > 0:
out += hash2[i] * n
for ch in j:
dic[ch] -= n
return ''.join(sorted(out))