题目描述
给你一个字符串 s ,其中包含字母顺序打乱的用英文单词表示的若干数字(0-9)。按 升序 返回原始的数字。
样例描述
示例 1:
输入:s = "owoztneoer"
输出:"012"
示例 2:
输入:s = "fviefuro"
输出:"45"
思路
简单模拟 + 词频统计 + 脑筋急转弯
由题目中单词的特性,可以根据一个特定的顺序来对原字符串拆解单词,保证一次用一个字母来判断一个单词是否存在。比如zero可以用z表示zero是否存在。
- 由上述可以得到一个可行的顺序,0, 8, 3, 2, 6, 4, 5, 1, 7, 9,依次按照这个顺序来解析即可。
- 注意有可能有多个重复的单词,所以要用while。
- 外层遍历特定顺序的索引,来判断是否存在各个数。
- 排序的话,可以先转成char数组,就能用数组工具类排序,然后再转回String。
代码
class Solution {
String[] nums = new String[]{"zero", "one", "two", "three", "four", "five",
"six", "seven", "eight", "nine"};
int[] order = new int[]{0, 8, 3, 2, 6, 4, 5, 1, 7, 9};
public String originalDigits(String s) {
int n = s.length();
//统计字母出现的词频
int cnt[] = new int[26];
for (char c: s.toCharArray()) {
cnt[c - 'a'] ++;
}
StringBuffer res = new StringBuffer();
//遍历特定顺序的索引,来依次看是否存在该数字
for (int x: order) {
//不断解析该数,因为不确定有多少个,所以不断循环
while(true) {
boolean flag = true;
String word = nums[x];
for (char c: word.toCharArray()) {
//如果不存在这个字母
if (cnt[c - 'a'] == 0) {
flag = false;
break;
}
}
//如果经过上面判断,都存在,说明按顺序可以解析出数字
if (flag) {
//加入结果集并且减少所有字母次数
res.append(x);
for (char c: word.toCharArray()) {
cnt[c - 'a'] --;
}
} else {
//没有就不存在
break;
}
}
}
//转化成字符数组再排序
char ch[] = res.toString().toCharArray();
Arrays.sort(ch);
return String.valueOf(ch);
}
}