Reconstruct Original Digits from English (M)
题目
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"
题意
将一个数字字符串中的每一个数字转化为英文,并打乱所有字符顺序,要求还原出数字字符串。
思路
找规律题。依照一定的顺序,每一个数字的英文中都有一个唯一的字符能代表这个英文,如'z'只能代表"zero"。可以发现有以下规律:
-
剩余数字:["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"],其中具有特征字符的有:
('z', "zero"), ('w', "two"), ('u', "four"), ('x', "six"), ('g', "eight")
-
剩余数字:["one", "three", "five", "seven", "nine"],其中具有特征字符的有:
('o', "one"), ('h', "three"), ('f', "five")
-
剩余数字:["seven", "nine"],其中具有特征字符的有:
('s', "seven"), ('i', "nine")
按照上述顺序转化即可得到答案。
代码实现
Java
class Solution {
public String originalDigits(String s) {
StringBuilder sb = new StringBuilder();
int[] digits = new int[10];
int[] cnt = new int[26];
for (char c : s.toCharArray()) {
cnt[c - 'a']++;
}
handleDigit(digits, cnt, 0, "zero", 'z');
handleDigit(digits, cnt, 2, "two", 'w');
handleDigit(digits, cnt, 4, "four", 'u');
handleDigit(digits, cnt, 6, "six", 'x');
handleDigit(digits, cnt, 8, "eight", 'g');
handleDigit(digits, cnt, 1, "one", 'o');
handleDigit(digits, cnt, 3, "three", 'h');
handleDigit(digits, cnt, 5, "five", 'f');
handleDigit(digits, cnt, 7, "seven", 's');
handleDigit(digits, cnt, 9, "nine", 'i');
for (int i = 0; i < 10; i++) {
for (int j = 0; j < digits[i]; j++) {
sb.append(i);
}
}
return sb.toString();
}
private void handleDigit(int[] digits, int[] cnt,int digit, String word, char unique) {
if (cnt[unique - 'a'] > 0) {
int tmp = cnt[unique - 'a'];
digits[digit] += tmp;
for (char c : word.toCharArray()) {
cnt[c - 'a'] -= tmp;
}
}
}
}