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);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值