問題:
Given a non-empty string containing an out-of-order English representation of digits 0-9, output the digits in ascending order.
Note:
1、Input contains only lowercase English letters.
2、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.
3、Input length is less than 50,000.
Example 1:Input: "owoztneoer"
Output: "012"Example 2:
Input: "fviefuro"
Output: "45"
大意:
給出一個非空字符串,由數(shù)字0~9的英文單詞的亂序組成,以升序的方式輸出所有的數(shù)字。
注意:
1、輸入只包含小寫英文字母。
2、輸入保證是有效的而且可以被轉(zhuǎn)換成原始數(shù)字。也就是說無效的輸入比如“abc”或者“zerone”是不允許的。
3、輸入長度小于5000。
例1:輸入:“owoztneoer”
輸出:“012”例2:
輸入:“fviefuro”
輸出:“45”
思路:
題目的意思是會將多個數(shù)字的英文單詞的字母打亂放置。
首先我們看看0~9數(shù)字對應的單詞:“zero”、“one”、“two”、“three”、“four”、“five”、“six”、“seven”、“eight”、“nine”。
在這些單詞中,我們先找到唯一存在的字母,這樣就可以根據(jù)這些字母直接推斷出存在該數(shù)字的英文單詞。唯一存在的字母有:0的‘z’、2的‘w’、4的‘u’、6的‘x’、8的‘g’,如果我們的字符串中有這些字母,那一定有這些數(shù)字,從而可以將相應的單詞中的字母全部清除一遍。
上面唯一的全部找完之后,剩下1、3、5、7、9,這些本身沒有唯一的字母,但是當上一批清除干凈后,就又存在一些唯一的字母了:1的‘o’、3的‘t’、5的‘f’。從而又可以根據(jù)這些目前唯一的字母清除一批數(shù)字的所有字母。
這時,剩下的7、9之間也有一些唯一的字母了,如7的‘s’、9的‘n’。從而也可以找出他們來。
要注意的是,每個數(shù)字并不是只會出現(xiàn)一次,而由于我們后面的數(shù)字的尋找需要將前面唯一的數(shù)字清楚干凈,所以我們一個是要按照順序來清,另一個是要循環(huán)將一個數(shù)字全部清干凈了再清下一個。
在實現(xiàn)過程中我第一個做法是直接對字符串進行操作,截取字符串來清除字母,但這個做法其實會很慢,即使用了StringBuffer也很慢,對于大量數(shù)據(jù)來說時就超時了。要注意題目說了所有字母都是小寫字母,我們其實可以用一個26位數(shù)字來記錄每個字母出現(xiàn)了幾次,在清楚字母時直接將對應位置的值減一就可以了,這樣對數(shù)組的操作會快很多。
代碼(Java):
public class Solution {
public String originalDigits(String s) {
int[] num = new int[10];
int[] totalChar = new int[26];
for (int i = 0; i < s.length(); i++) {
totalChar[s.charAt(i) - 'a']++;
}
while (totalChar['z'-'a'] > 0) {
num[0]++;
totalChar['z'-'a']--;
totalChar['e'-'a']--;
totalChar['r'-'a']--;
totalChar['o'-'a']--;
}
while (totalChar['w'-'a'] > 0) {
num[2]++;
totalChar['t'-'a']--;
totalChar['w'-'a']--;
totalChar['o'-'a']--;
}
while (totalChar['u'-'a'] > 0) {
num[4]++;
totalChar['f'-'a']--;
totalChar['o'-'a']--;
totalChar['u'-'a']--;
totalChar['r'-'a']--;
}
while (totalChar['x'-'a'] > 0) {
num[6]++;
totalChar['s'-'a']--;
totalChar['i'-'a']--;
totalChar['x'-'a']--;
}
while (totalChar['g'-'a'] > 0) {
num[8]++;
totalChar['e'-'a']--;
totalChar['i'-'a']--;
totalChar['g'-'a']--;
totalChar['h'-'a']--;
totalChar['t'-'a']--;
}
while (totalChar['o'-'a'] > 0) {
num[1]++;
totalChar['o'-'a']--;
totalChar['n'-'a']--;
totalChar['e'-'a']--;
}
while (totalChar['t'-'a'] > 0) {
num[3]++;
totalChar['t'-'a']--;
totalChar['h'-'a']--;
totalChar['r'-'a']--;
totalChar['e'-'a']--;
totalChar['e'-'a']--;
}
while (totalChar['f'-'a'] > 0) {
num[5]++;
totalChar['f'-'a']--;
totalChar['i'-'a']--;
totalChar['v'-'a']--;
totalChar['e'-'a']--;
}
while (totalChar['s'-'a'] > 0) {
num[7]++;
totalChar['s'-'a']--;
totalChar['e'-'a']--;
totalChar['v'-'a']--;
totalChar['e'-'a']--;
totalChar['n'-'a']--;
}
while (totalChar['n'-'a'] > 0) {
num[9]++;
totalChar['n'-'a']--;
totalChar['i'-'a']--;
totalChar['n'-'a']--;
totalChar['e'-'a']--;
}
String res = "";
StringBuffer sb = new StringBuffer(res);
for (int i = 0; i < num.length; i++) {
if (num[i] > 0) {
for (int j = 0; j < num[i]; j++)
sb.append(String.valueOf(i));
}
}
res = sb.toString();
return res;
}
}
合集:https://github.com/Cloudox/LeetCode-Record