摘要:如對應的英文表達為并繼續亂序成。要求輸入亂序的英文表達式,找出其中包含的所有的數字,并按照從小到大輸出。思路和代碼首先將數字和英文表示列出來粗略一看,我們知道有許多字母只在一個英文數字中出現,比如只出現在中。
題目要求
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(); }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/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_...
閱讀 3610·2020-12-03 17:42
閱讀 2780·2019-08-30 15:54
閱讀 2237·2019-08-30 15:44
閱讀 581·2019-08-30 14:08
閱讀 980·2019-08-30 14:00
閱讀 1118·2019-08-30 13:46
閱讀 2798·2019-08-29 18:33
閱讀 2944·2019-08-29 14:11