Reconstruct Original Digits from English
问题:
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"
解决:
【题意】给定0~9的英文的乱序字符串,将其解析为数字,并升序输出。
①
观察0-9的英文"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine",
可以发现一些字母只在某一个单词中出现,如z,w,u,x,g这5个单词,分别只出现在zero,two,four,six,eight中,那么这五个数字的个数就可以被确定了;
由于含有o的单词有zero,two,four,one,其中前三个都被确定了,那么one的个数也就知道了;
由于含有t的单词有two,three,eight,其中two,eight个数已知,那么three的个数就知道了;
由于含有f的单词有four,five,其中four个数已知,那么five的个数就知道了;
由于含有s的单词有six,seven,其中six个数已知,那么seven的个数就知道了;
由于含有i的单词有six,eight,five,nine,其中前三个都被确定了,那么nine的个数就知道了,知道了这些问题就变的容易多了,
我们按这个顺序"zero", "two", "four", "six", "eight", "one", "three", "five", "seven", "nine"就能找出所有的个数了。
class Solution { //293ms
public String originalDigits(String s) {
int[] hash = new int[26];
for (char c : s.toCharArray()){
hash[c - 'a'] ++;
}
int[] digits = new int[10];//标识0~9的个数
digits[0] = hash['z' - 'a'];//只有0的英文包含z
digits[2] = hash['w' - 'a'];
digits[4] = hash['u' - 'a'];
digits[6] = hash['x' - 'a'];
digits[8] = hash['g' - 'a'];
digits[1] = hash['o' - 'a'] - digits[0] - digits[2] - digits[4];
digits[3] = hash['t' - 'a'] - digits[2] - digits[8];
digits[5] = hash['f' - 'a'] - digits[4];
digits[7] = hash['s' - 'a'] - digits[6];
digits[9] = hash['i' - 'a'] - digits[5] - digits[6] - digits[8];
String res = "";
for (int i = 0;i <= 9;i ++){
while (digits[i] > 0){
res += i;
digits[i] --;
}
}
return res;
}
}
② 跟上面的差不多,但是时间差很多。。
class Solution { //12ms
public String originalDigits(String s) {
if (s == null || s.length() == 0) {
return "";
}
int[] hash = new int[128];
for (char c : s.toCharArray()) {
hash[c] ++;
}
int[] nums = new int[10];
nums[0] = hash['z'];
nums[2] = hash['w'];
nums[4] = hash['u'];
nums[6] = hash['x'];
nums[8] = hash['g'];
nums[3] = hash['h'] - nums[8];
nums[1] = hash['o'] - nums[2] - nums[4] - nums[0];
nums[5] = hash['f'] - nums[4];
nums[7] = hash['s'] - nums[6];
nums[9] = hash['i'] - nums[5] - nums[6] - nums[8];
StringBuilder res = new StringBuilder();
for (int i = 0; i < 10; i++) {
for (int j = 1; j <= nums[i]; j ++) {
res.append(i);
}
}
return res.toString();
}
}