给定一个非空字符串,其中包含字母顺序打乱的英文单词表示的数字0-9
。按升序输出原始的数字。
注意:
- 输入只包含小写英文字母。
- 输入保证合法并可以转换为原始的数字,这意味着像 "abc" 或 "zerone" 的输入是不允许的。
- 输入字符串的长度小于 50,000。
示例 1:
输入: "owoztneoer" 输出: "012" (zeroonetwo)
示例 2:
输入: "fviefuro" 输出: "45" (fourfive)
思路:
观察可得,一些单词是比较特殊的,可以通过统计特定字母的出现个数来统计单词数,
比如:假设s里有5个z,就可以直接得出结论,s里有5个zero,因为z这个字母只在s里出现过。
类似的, w 可以找到2, u可以找到4, x 可以找到6……
把找到的单词排除之后剩下的单词也可以通过相同的规律来找。
class Solution(object):
def originalDigits(self, s):
"""
:type s: str
:rtype: str
"""
# zero one two three four five six seven eight nine
# z o(先2 w r(先4) u f(先4) x s(先6) t(先3) 最后看e
#所以一个可行的查找的顺序是 zero, two, four, six, one, three, five, seven, eight, nine
order = ["zero", "two", "four", "six", "one", "three", "five", "seven", "eight", "nine"]
find = ["z", "w", "u", "x", "o", "r", "f", "v", "t", "e"]
digit = [0, 2, 4, 6, 1, 3, 5, 7, 8, 9]
record = [0 for _ in range(10)]
dic = collections.Counter(s)
for idx in range(10): #按digit数组的顺序遍历0~9
cnt = dic[find[idx]] #看看可以组成几个digit[idx]
record[digit[idx]] += cnt #记录下来
dic = dic - collections.Counter(order[idx] * cnt) #字典里减去对应的字母
if not dic:
break
ress = ""
for i in range(10): #转换成题目需要的格式
ress += str(i) * record[i]
return ress