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);
    }
}

猜你喜欢

转载自blog.csdn.net/Sherlock_Obama/article/details/121509769