摘要:如对应的英文表达为并继续乱序成。要求输入乱序的英文表达式,找出其中包含的所有的数字,并按照从小到大输出。思路和代码首先将数字和英文表示列出来粗略一看,我们知道有许多字母只在一个英文数字中出现,比如只出现在中。
题目要求
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"
一个非空的英文字符串,其中包含着乱序的阿拉伯数字的英文单词。如012对应的英文表达为zeroonetwo并继续乱序成owoztneoer。要求输入乱序的英文表达式,找出其中包含的所有0-9的数字,并按照从小到大输出。
思路和代码首先将数字和英文表示列出来:
0 zero 1 one 2 two 3 three 4 four 5 five 6 six 7 seven 8 eight 9 nine
粗略一看,我们知道有许多字母只在一个英文数字中出现,比如z只出现在zero中。因此对于这种字母,它一旦出现,就意味着该数字一定出现了。
因此一轮过滤后可以得出只出现一次的字母如下:
0 zero -> z 1 one 2 two -> w 3 three 4 four -> u 5 five 6 six -> x 7 seven 8 eight 9 nine
再对剩下的数字字母过滤出只出现一次的字母:
1 one 3 three -> r 5 five -> f 7 seven -> s 8 eight -> g 9 nine
最后对one和nine分别用o和i进行区分即可。因此可以得出如下代码:
public String originalDigits(String s) { int[] letterCount = new int[26]; for(char c : s.toCharArray()) { letterCount[c-"a"]++; } int[] result = new int[10]; //zero if((result[2] = letterCount["z"-"a"]) != 0) { result[0] = letterCount["z" - "a"]; letterCount["z"-"a"] = 0; letterCount["e"-"a"] -= result[0]; letterCount["r"-"a"] -= result[0]; letterCount["o"-"a"] -= result[0]; } //two if((result[2] = letterCount["w"-"a"]) != 0) { letterCount["t"-"a"] -= result[2]; letterCount["w"-"a"] = 0; letterCount["o"-"a"] -= result[2]; } //four if((result[4] = letterCount["u"-"a"]) != 0) { letterCount["f"-"a"] -= result[4]; letterCount["o"-"a"] -= result[4]; letterCount["u"-"a"] -= result[4]; letterCount["r"-"a"] -= result[4]; } //five if((result[5] = letterCount["f"-"a"]) != 0) { letterCount["f"-"a"] -= result[5]; letterCount["i"-"a"] -= result[5]; letterCount["v"-"a"] -= result[5]; letterCount["e"-"a"] -= result[5]; } //six if((result[6] = letterCount["x"-"a"]) != 0) { letterCount["s"-"a"] -= result[6]; letterCount["i"-"a"] -= result[6]; letterCount["x"-"a"] -= result[6]; } //seven if((result[7] = letterCount["s"-"a"]) != 0) { letterCount["s"-"a"] -= result[7]; letterCount["e"-"a"] -= result[7] * 2; letterCount["v"-"a"] -= result[7]; letterCount["n"-"a"] -= result[7]; } //one if((result[1] = letterCount["o"-"a"]) != 0) { letterCount["o"-"a"] -= result[1]; letterCount["n"-"a"] -= result[1]; letterCount["e"-"a"] -= result[1]; } //eight if((result[8] = letterCount["g"-"a"]) != 0) { letterCount["e"-"a"] -= result[8]; letterCount["i"-"a"] -= result[8]; letterCount["g"-"a"] -= result[8]; letterCount["h"-"a"] -= result[8]; letterCount["t"-"a"] -= result[8]; } //nine if((result[9] = letterCount["i"-"a"]) != 0) { letterCount["n"-"a"] -= result[9] * 2; letterCount["i"-"a"] -= result[9]; letterCount["e"-"a"] -= result[9]; } result[3] = letterCount["t"-"a"]; StringBuilder sb = new StringBuilder(); for(int i = 0 ; i上面的代码未免写的太繁琐了,对其进一步优化可以得到如下代码:
public String originalDigits2(String s) { int[] alphabets = new int[26]; for (char ch : s.toCharArray()) { alphabets[ch - "a"] += 1; } int[] digits = new int[10]; digits[0] = alphabets["z" - "a"]; digits[2] = alphabets["w" - "a"]; digits[6] = alphabets["x" - "a"]; digits[8] = alphabets["g" - "a"]; digits[7] = alphabets["s" - "a"] - digits[6]; digits[5] = alphabets["v" - "a"] - digits[7]; digits[3] = alphabets["h" - "a"] - digits[8]; digits[4] = alphabets["f" - "a"] - digits[5]; digits[9] = alphabets["i" - "a"] - digits[6] - digits[8] - digits[5]; digits[1] = alphabets["o" - "a"] - digits[0] - digits[2] - digits[4]; StringBuilder sb = new StringBuilder(); for (int d = 0; d < 10; d++) { for (int count = 0; count < digits[d]; count++) sb.append(d); } return sb.toString(); }
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/74207.html
摘要:复杂度思路重建,应为要按进行排序,所以用来决定下一个要出去的值。 Leetcode[332] Reconstruct Itinerary Given a list of airline tickets represented by pairs of departure andarrival airports [from, to], reconstruct the itinerary ...
摘要:反转比较法复杂度时间空间思路回文数有一个特性,就是它反转后值是一样的。代码逐位比较法复杂度时间空间思路反转比较有可能会溢出,但我们遍历每一位的时候其实并不用保存上一位的信息,只要和当前对应位相等就行了。首先,负数是否算回文。 Palindrome Number Determine whether an integer is a palindrome. Do this witho...
摘要:来自大神的解答,只能膜拜。题目确定了至少有一条的行程不存在分支情况,一定有相同的最终目的地,而且对于多条的行程,要选取字母顺序较小的一条。 Problem Given a list of airline tickets represented by pairs of departure and arrival airports [from, to], reconstruct the i...
摘要:这里要注意的是的用法。所以记住,用可以从自动分离出数组。跳过第一个元素并放入数组最快捷语句建立的用意记录处理过的结点并按处理所有结点和自己的连接下面先通过判断,再修改的符号的顺序,十分巧妙更轻便的解法 Problem Design an algorithm and write code to serialize and deserialize a binary tree. Writin...
摘要:利用栈我们可以存储外围层已持有的字符串以及应当展开的次数。用栈的思路来写要求思路更加严谨,以免出现逻辑错误。这里需要额外注意的是,如果当前该括号外围存在父元素,则我们应当将父元素的计数和已有字符串压入栈中。 题目要求 Given an encoded string, return its decoded string. The encoding rule is: k[encoded_...
阅读 3579·2020-12-03 17:42
阅读 2727·2019-08-30 15:54
阅读 2201·2019-08-30 15:44
阅读 545·2019-08-30 14:08
阅读 951·2019-08-30 14:00
阅读 1089·2019-08-30 13:46
阅读 2771·2019-08-29 18:33
阅读 2758·2019-08-29 14:11