题目
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;}}}}
