Leetcode--Java--423. 从英文中重建数字

题目描述

给你一个字符串 s ,其中包含字母顺序打乱的用英文单词表示的若干数字(0-9)。按 升序 返回原始的数字。

样例描述

示例 1:

输入:s = "owoztneoer"
输出:"012"
示例 2:

输入:s = "fviefuro"
输出:"45"

思路

简单模拟 + 词频统计 + 脑筋急转弯
由题目中单词的特性,可以根据一个特定的顺序来对原字符串拆解单词,保证一次用一个字母来判断一个单词是否存在。比如zero可以用z表示zero是否存在。

  1. 由上述可以得到一个可行的顺序,0, 8, 3, 2, 6, 4, 5, 1, 7, 9,依次按照这个顺序来解析即可。
  2. 注意有可能有多个重复的单词,所以要用while。
  3. 外层遍历特定顺序的索引,来判断是否存在各个数。
  4. 排序的话,可以先转成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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值