描述
给你一个字符串 s ,其中包含字母顺序打乱的用英文单词表示的若干数字(0-9)。按 升序 返回原始的数字。
分析
有的“数字单词”是可以通过一个字母的数量就能得知单词出现的次数,有的需要多个字母一起推导才能得出,由此给数字排优先级,方便计算各个“数字单词”出现的次数。
参考:
“宫水三叶”:https://leetcode-cn.com/problems/reconstruct-original-digits-from-english/solution/gong-shui-san-xie-nao-jin-ji-zhuan-wan-m-vg7a/
以及评论区的题解:
字符数组是可以排序的!
char[] ch = sb.toString().toCharArray(); Arrays.sort(ch);
可以将字符数组直接转成字符串
String.valueOf(ch);
class Solution {
public String originalDigits(String s) {
Map<Character,Integer> map = new HashMap<>();
String[] str = new String[]{
"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
int[] priority = new int[]{
0,6,2,4,8,7,3,5,1,9};
StringBuffer sb = new StringBuffer("");
//统计字符串s中的字母出现的次数
for(int i = 0; i < s.length(); i++){
if(map.containsKey(s.charAt(i))){
map.put(s.charAt(i),map.get(s.charAt(i))+1);
}else{
map.put(s.charAt(i),1);
}
}
//根据优先级先后计算“数字单词”出现的次数
for(int i : priority){
int k = Integer.MAX_VALUE;
//取较小值,最小的k一定代表这个单词出现的次数
for(int j = 0; j < str[i].length(); j++){
k = Math.min(k,map.getOrDefault(str[i].charAt(j),0));
}
//从Map中减去这个单词对应的字母出现的次数
for(int j = 0; j < str[i].length(); j++){
int deduct = map.getOrDefault(str[i].charAt(j),0) - k;
map.put(str[i].charAt(j),deduct);
}
//出现了k次所以要加入k次i
while(k > 0){
sb.append(i);
k--;
}
}
//题目要求按由小到大的顺序排序。字符数组是可以排序的!可以将字符数组直接转成字符串
char[] ch = sb.toString().toCharArray();
Arrays.sort(ch);
return String.valueOf(ch);
}
}