从英文中重建数字
给定一个非空字符串,其中包含字母顺序打乱的英文单词表示的数字0-9。按升序输出原始的数字。
注意:
- 输入只包含小写英文字母。
- 输入保证合法并可以转换为原始的数字,这意味着像 "abc" 或 "zerone" 的输入是不允许的。
- 输入字符串的长度小于 50,000。
示例 1:
输入: "owoztneoer"
输出: "012" (zeroonetwo)
示例 2:
输入: "fviefuro"
输出: "45" (fourfive)
解题思路
这道题看起来就不是很难,第一步肯定得写一下各个数字对应的英文单词,看看它们都包含了哪些字符,并且找找有没有什么规律或是特点。
所以我列出了下面的表格:
字母 包含该字母的单词
e zero, one, three, five, seven, eight, nine
f four, five
g eight
h three, eight
i five, six, eight, nine
n one, seven, nine
o zero, one, two, four
r zero, three, four
s six, seven
t two, three, eight
u four
v five, seven
w two
x six
z zero
由上表我们发现部分字符是某个单词独有,这意味着这些字符的个数就是数字的个数,比如说'z'这个字符是zero单词独有的, 所以'z'的个数就是0的个数。
如果我们用numbers数组存储出现的数字个数,其中下标表示着对应0-9的数字,那么我们会有下面这个结果:
数字 数字的个数
0 numbers[0] = 'z'的个数
2 numbers[2] = 'w'的个数
4 numbers[4] = 'u'的个数
6 numbers[6] = 'x'的个数
8 numbers[8] = 'g'的个数
而其他的数字个数,比如5的个数,因为'f'的数目由four和five的数目组成,而我们已知four的数目为numbers[4],所以numbers[5] = 'f'的个数-number[4]。其他的数字同样处理。
最后我们得到了下面的结果:
数字 数字的个数
0 numbers[0] = 'z'的个数
2 numbers[2] = 'w'的个数
4 numbers[4] = 'u'的个数
6 numbers[6] = 'x'的个数
8 numbers[8] = 'g'的个数
5 numbers[5] = 'f'的个数 - numbers[4]
3 numbers[3] = 'h'的个数 - numbers[8]
7 numbers[7] = 's'的个数 - numbers[6]
1 numbers[1] = 'o'的个数 - numbers[0] - numbers[2] - numbers[4]
9 numbers[9] = 'i'的个数 - numbers[5] - numbers[6] - numbers[8]
利用这个表格,通过代码找出上面表格中出现的字符的数目,然后按照表格里的公式,就能得到所有数字出现的次数,最后按照顺序把相应个数的数字添加到结果字符串中就通过了这道题。
1 public class Solution { 2 public String originalDigits(String s) { 3 int[] temp = new int[26]; 4 int[] digit = new int[10]; 5 6 for(int i = 0; i < s.length(); i++) { 7 temp[s.charAt(i)-97]++; 8 } 9 10 digit[0] = temp['z' -97]; 11 digit[2] = temp['w' -97]; 12 digit[6] = temp['x' -97]; 13 digit[8] = temp['g' -97]; 14 digit[4] = temp['u' -97]; 15 16 digit[1] = temp['o' -97] - (digit[0] + digit[2] + digit[4]); 17 digit[3] = temp['h' -97] - digit[8]; 18 digit[5] = temp['f' -97] - digit[4]; 19 digit[7] = temp['s' -97] - digit[6]; 20 digit[9] = temp['i' -97] - (digit[6] + digit[8] + digit[5]); 21 22 StringBuilder sb = new StringBuilder(); 23 for(int i = 0; i < digit.length; i++){ 24 for(int j = 0; j < digit[i]; j++){ 25 sb.append(i+""); 26 } 27 } 28 return sb.toString(); 29 } 30 }