Given a non-empty string containing an out-of-order English representation of digits 0-9, output the digits in ascending order. Note: Input contains only lowercase English letters. Input is guaranteed to be valid and can be transformed to its original digits. That means invalid inputs such as "abc" or "zerone" are not permitted. Input length is less than 50,000. Example 1: Input: "owoztneoer" Output: "012" Example 2: Input: "fviefuro" Output: "45"
一個非空的英文字符串,其中包含着亂序的阿拉伯數字的英文單詞。如012
對應的英文表達爲zeroonetwo
並繼續亂序成owoztneoer
。要求輸入亂序的英文表達式,找出其中包含的全部0-9
的數字,並按照從小到大輸出。java
首先將數字和英文表示列出來:git
0 zero 1 one 2 two 3 three 4 four 5 five 6 six 7 seven 8 eight 9 nine
粗略一看,咱們知道有許多字母只在一個英文數字中出現,好比z只出如今zero中。所以對於這種字母,它一旦出現,就意味着該數字必定出現了。
所以一輪過濾後能夠得出只出現一次的字母以下:app
0 zero -> z 1 one 2 two -> w 3 three 4 four -> u 5 five 6 six -> x 7 seven 8 eight 9 nine
再對剩下的數字字母過濾出只出現一次的字母:less
1 one 3 three -> r 5 five -> f 7 seven -> s 8 eight -> g 9 nine
最後對one和nine分別用o和i進行區分便可。所以能夠得出以下代碼:優化
public String originalDigits(String s) { int[] letterCount = new int[26]; for(char c : s.toCharArray()) { letterCount[c-'a']++; } int[] result = new int[10]; //zero if((result[2] = letterCount['z'-'a']) != 0) { result[0] = letterCount['z' - 'a']; letterCount['z'-'a'] = 0; letterCount['e'-'a'] -= result[0]; letterCount['r'-'a'] -= result[0]; letterCount['o'-'a'] -= result[0]; } //two if((result[2] = letterCount['w'-'a']) != 0) { letterCount['t'-'a'] -= result[2]; letterCount['w'-'a'] = 0; letterCount['o'-'a'] -= result[2]; } //four if((result[4] = letterCount['u'-'a']) != 0) { letterCount['f'-'a'] -= result[4]; letterCount['o'-'a'] -= result[4]; letterCount['u'-'a'] -= result[4]; letterCount['r'-'a'] -= result[4]; } //five if((result[5] = letterCount['f'-'a']) != 0) { letterCount['f'-'a'] -= result[5]; letterCount['i'-'a'] -= result[5]; letterCount['v'-'a'] -= result[5]; letterCount['e'-'a'] -= result[5]; } //six if((result[6] = letterCount['x'-'a']) != 0) { letterCount['s'-'a'] -= result[6]; letterCount['i'-'a'] -= result[6]; letterCount['x'-'a'] -= result[6]; } //seven if((result[7] = letterCount['s'-'a']) != 0) { letterCount['s'-'a'] -= result[7]; letterCount['e'-'a'] -= result[7] * 2; letterCount['v'-'a'] -= result[7]; letterCount['n'-'a'] -= result[7]; } //one if((result[1] = letterCount['o'-'a']) != 0) { letterCount['o'-'a'] -= result[1]; letterCount['n'-'a'] -= result[1]; letterCount['e'-'a'] -= result[1]; } //eight if((result[8] = letterCount['g'-'a']) != 0) { letterCount['e'-'a'] -= result[8]; letterCount['i'-'a'] -= result[8]; letterCount['g'-'a'] -= result[8]; letterCount['h'-'a'] -= result[8]; letterCount['t'-'a'] -= result[8]; } //nine if((result[9] = letterCount['i'-'a']) != 0) { letterCount['n'-'a'] -= result[9] * 2; letterCount['i'-'a'] -= result[9]; letterCount['e'-'a'] -= result[9]; } result[3] = letterCount['t'-'a']; StringBuilder sb = new StringBuilder(); for(int i = 0 ; i<result.length ; i++) { for(int j = 0 ; j<result[i] ; j++) { sb.append(i); } } return sb.toString(); }
上面的代碼未免寫的太繁瑣了,對其進一步優化能夠獲得以下代碼:ui
public String originalDigits2(String s) { int[] alphabets = new int[26]; for (char ch : s.toCharArray()) { alphabets[ch - 'a'] += 1; } int[] digits = new int[10]; digits[0] = alphabets['z' - 'a']; digits[2] = alphabets['w' - 'a']; digits[6] = alphabets['x' - 'a']; digits[8] = alphabets['g' - 'a']; digits[7] = alphabets['s' - 'a'] - digits[6]; digits[5] = alphabets['v' - 'a'] - digits[7]; digits[3] = alphabets['h' - 'a'] - digits[8]; digits[4] = alphabets['f' - 'a'] - digits[5]; digits[9] = alphabets['i' - 'a'] - digits[6] - digits[8] - digits[5]; digits[1] = alphabets['o' - 'a'] - digits[0] - digits[2] - digits[4]; StringBuilder sb = new StringBuilder(); for (int d = 0; d < 10; d++) { for (int count = 0; count < digits[d]; count++) sb.append(d); } return sb.toString(); }