0数学/字符串中等 LeetCode423. 从英文中重建数字

423. 从英文中重建数字

描述

给你一个字符串 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);
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43260719/article/details/121527136