[LeetCode] 423 Reconstruct Original Digits from English
Given a non-empty string containing an out-of-order English representation of digits 0-9
, output the digits in ascending order.
Note:
- Input contains only lowercase English letters.
- Input is guaranteed to be valid and can be transformed to its original digits. That means invalid inputs such as "abc" or "zerone" are not permitted.
- Input length is less than 50,000.
Example 1:
Input: "owoztneoer" Output: "012"
Example 2:
Input: "fviefuro" Output: "45"
解法:原来的字符串是乱序的,当遇到一个字母 e 的时候,并没有办法知道这个字符是属于 one、three、nine等中的一个。但是当遇到一个 z 的时候,肯定
是可以确定这个字符是属于 zero 的,因为z只出现在zero中,同理,x 也只出现在six中。
那么这就是一个优先级的问题,应该优先匹配那些属于少数数字的字符,例如优先寻找z,如果出现一个z,那么必须相应的出现e、r、o。如果字符串里面已经没有z了,
那么这个时候如果还出现了r,那么这个 r 就只可能属于 three、four中的一个了,依次类推,就能得到解法。
for (char c : s.toCharArray()) { count[c]++; } int[] res = new int[10]; char[] idx = {'z', 'x', 's', 'v', 'f', 'r', 'w', 'g', 'o', 'i'}; //char[] idx = {'z', 'x', 's', 'v', 'f', 'r', 'w', 'g', 'o', 'i'}; for (char i : idx) { while (count[i] > 0) { switch (i) { case 'z': //匹配z,减去zero res[0]++; count['z']--; count['e']--; count['r']--; count['o']--; break; case 'x': //匹配six,减去six res[6]++; count['s']--; count['i']--; count['x']--; break; case 's': //匹配seven,因为之前优先匹配了six,如果这个时候,还有多余的s,那么肯定是seven res[7]++; count['s']--; count['e']--; count['v']--; count['e']--; count['n']--; break; case 'v': //匹配five,因为之前优先匹配了seven,如果这个时候还出现v,那么肯定是属于five res[5]++; count['f']--; count['i']--; count['v']--; count['e']--; break; case 'f': //匹配four,因为之前匹配了four,那么这个时候还出现f,那么肯定属于four res[4]++; count['f']--; count['o']--; count['u']--; count['r']--; break; case 'r': //匹配three,因为之前匹配了four,还出现three,肯定属于three res[3]++; count['t']--; count['h']--; count['r']--; count['e']--; count['e']--; break; case 'w': res[2]++; count['t']--; count['w']--; count['o']--; break; case 'g': res[8]++; count['e']--; count['i']--; count['g']--; count['h']--; count['t']--; break; case 'o': res[1]++; count['o']--; count['n']--; count['e']--; break; case 'i': res[9]++; count['n']--; count['i']--; count['n']--; count['e']--; break; default: break; } } } //System.out.print(res[0]); StringBuilder sb = new StringBuilder(); for (int i = 0; i <= 9; i++) { for (int j = 0; j < res[i]; j++) { sb.append(i); } } return sb.toString(); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?