423. 从英文中重建数字

给定一个非空字符串,其中包含字母顺序打乱的英文单词表示的数字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))

你可能感兴趣的:(LeetCode)