# Code language: Python classSolution: deforiginalDigits(self, s: str) -> str: cnt = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine'] s = defaultdict(set) for num in cnt: for c in num: s[c].add(num) for i, j in s.items(): print(f'{i} : {j}') return''
输出了这样的结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
z : {'zero'} e : {'zero', 'nine', 'one', 'eight', 'five', 'three', 'seven'} r : {'four', 'zero', 'three'} o : {'four', 'zero', 'two', 'one'} n : {'nine', 'seven', 'one'} t : {'eight', 'two', 'three'} w : {'two'} h : {'eight', 'three'} f : {'four', 'five'} u : {'four'} i : {'eight', 'nine', 'six', 'five'} v : {'five', 'seven'} s : {'six', 'seven'} x : {'six'} g : {'eight'}
很惊喜的发现有几个字母只会在一个数字的英文中出现!
z 只在 zero 中出现
w 只在 two 中出现
u 只在 four 中出现
x 只在 six 中出现
g 只在 eight 中出现
所以根据 z, w, u, x, g 四个字母的频次就能确定 0, 2, 4, 6, 8
的出现次数
z : {0} e : {0, 'nine', 'one', 8, 'five', 'three', 'seven'} r : {4, 0, 'three'} o : {4, 0, 2, 'one'} n : {'nine', 'seven', 'one'} t : {8, 2, 'three'} w : {2} h : {8, 'three'} f : {4, 'five'} u : {4} i : {8, 'nine', 6, 'five'} v : {'five', 'seven'} s : {6, 'seven'} x : {6} g : {8}
容易发现:
根据 o 可以确定 1
根据 t 或 h 可以确定 3
根据 f 可以确定 5
根据 s 可以确定 7
好的,最后我们只剩下 9
还没确定了,但这不难,因为其他所有数字都已经确定频次了,所以只需任意找
n, i, e 中的一个就能确定 9 (不过需要注意的是 n 在 three, seven, nine
中出现了两次)
# Code language: Python import numpy as np classSolution: deforiginalDigits(self, s: str) -> str: cnt = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine'] st = set(i for c in cnt for i in c) # 看看出现过哪些字母 keys = list(st) A = np.array([[c.count(k) for k in keys] for c in cnt]) b = np.array([[s.count(k)] for k in keys]) x = np.linalg.pinv(A.T).dot(b) return''.join(i * round(j) for i, j inzip('0123456789', x.T.tolist()[0]))