Go Java算法之从英文中重建数字示例详解

作者:黄丫丫 时间:2023-10-25 02:37:26 

从英文中重建数字

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

示例 1:

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

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

提示:

1 <= s.length <= 105

s[i] 为 ["e","g","f","i","h","o","n","s","r","u","t","w","v","x","z"] 这些字符之一

s 保证是一个符合题目要求的字符串

Java实现

先对 s 进行词频统计,然后根据「英文单词中的字符唯一性」确定构建的顺序,最后再对答案进行排序即可。

  • zero 中的 z 在其余所有单词中都没出现过,可以先统计 zero 的出现次数,并构建 00;然后观察剩余数字,其中 eight 中的 g 具有唯一性,构建 88;

  • 再发现 six 中的 x 具有唯一性,构建 66;

  • 发现 three 中的 h 具有唯一性(利用在此之前 eight 已经被删除干净,词频中仅存在 three 对应的 h),构建 33 ...

最终可以确定一个可行的构建序列为 0, 8, 6, 3, 2, 7, 5, 9, 4, 1。

class Solution {
   static String[] ss = new String[]{"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
   static int[] priority = new int[]{0, 8, 6, 3, 2, 7, 5, 9, 4, 1};
   public String originalDigits(String s) {
       int n = s.length();
       int[] cnts = new int[26];
       for (int i = 0; i < n; i++) cnts[s.charAt(i) - 'a']++;
       StringBuilder sb = new StringBuilder();
       for (int i : priority) {
           int k = Integer.MAX_VALUE;
           for (char c : ss[i].toCharArray()) k = Math.min(k, cnts[c - 'a']);
           for (char c : ss[i].toCharArray()) cnts[c - 'a'] -= k;
           while (k-- > 0) sb.append(i);
       }
       char[] cs = sb.toString().toCharArray();
       Arrays.sort(cs);
       return String.valueOf(cs);
   }
}

时间复杂度:O(mlogm)

空间复杂度:O(L+m)

Go实现

输入中各个字母的个数,可以知道一些数字的个数了,比如只有零用了z,只有六用了x等等,

在将一些可以求得的个数求了后,将它们占用的其他字母的个数排除掉,经过排除后,剩下的有用到别人用过的字母的数字的个数也可以得到了。 比如在四的个数通过u得到后,五的个数就可以通过剩下的f的个数得到了。

func originalDigits(s string) string {
   cnts, a := make([]int, 26), byte('a')
   for i := range s {
       cnts[s[i] - a]++
   }
   zeros, twos, fours, sixs, eights := cnts[byte('z') - a], cnts[byte('w') - a], cnts[byte('u') - a], cnts[byte('x') - a], cnts[byte('g') - a]
   fives, sevens, ones, threes := cnts[byte('f') - a] - fours, cnts[byte('s') - a] - sixs, cnts[byte('o') - a] - zeros - twos - fours, cnts[byte('h') - a] - eights
   nines := cnts[byte('i') - a] - fives - sixs - eights
   return strings.Repeat("0", zeros) + strings.Repeat("1", ones) + strings.Repeat("2", twos) + strings.Repeat("3", threes) + strings.Repeat("4", fours) + strings.Repeat("5", fives) + strings.Repeat("6", sixs) + strings.Repeat("7", sevens) + strings.Repeat("8", eights) + strings.Repeat("9", nines)
}

时间复杂度:O(mlogm)

空间复杂度:O(L+m)

来源:https://juejin.cn/post/7129154986163830815

标签:Go,Java,算法,英文,重建数字
0
投稿

猜你喜欢

  • c# 成员类型访问权限低于字段本身的实现

    2021-12-23 07:08:27
  • Android 列表选择框 Spinner详解及实例

    2021-11-18 14:59:08
  • Spring boot 连接多数据源过程详解

    2023-11-28 12:09:51
  • Java设计模式的事件模型详解

    2023-11-29 04:47:08
  • android BitmapFactory.Options使用方法详解

    2023-05-04 08:50:20
  • spring boot 即时重新启动(热更替)使用说明

    2023-01-19 02:41:05
  • Android权限询问的实例详解

    2022-10-03 21:28:51
  • Android实现单页面浮层可拖动view的示例代码

    2023-05-25 16:41:03
  • Android嵌套RecyclerView左右滑动替代自定义view

    2023-03-27 14:51:17
  • Android中生成、使用Json数据实例

    2023-02-04 15:01:24
  • Java中的stream流的概念解析及实际运用总结

    2022-06-10 23:19:10
  • 为spring get请求添加自定义的参数处理操作(如下划线转驼峰)

    2021-12-04 13:01:43
  • MyBatis3源码解析之如何获取数据源详解

    2023-12-06 02:23:08
  • Android仿iOS侧滑退出当前界面功能

    2022-07-01 10:08:37
  • springboot打包部署到linux服务器的方法

    2021-09-26 14:56:14
  • java多线程Future和Callable类示例分享

    2021-09-02 09:49:37
  • Java微信公众平台开发(14) 微信web开发者工具使用

    2023-01-30 19:21:34
  • Spring运行时动态注册bean的方法

    2023-11-25 04:16:58
  • Java动态添加view的方法

    2023-06-11 04:20:38
  • Spring多个数据源配置详解

    2023-09-20 18:22:18
  • asp之家 软件编程 m.aspxhome.com