摘要:如對(duì)應(yīng)的英文表達(dá)為并繼續(xù)亂序成。要求輸入亂序的英文表達(dá)式,找出其中包含的所有的數(shù)字,并按照從小到大輸出。思路和代碼首先將數(shù)字和英文表示列出來粗略一看,我們知道有許多字母只在一個(gè)英文數(shù)字中出現(xiàn),比如只出現(xiàn)在中。
題目要求
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"
一個(gè)非空的英文字符串,其中包含著亂序的阿拉伯?dāng)?shù)字的英文單詞。如012對(duì)應(yīng)的英文表達(dá)為zeroonetwo并繼續(xù)亂序成owoztneoer。要求輸入亂序的英文表達(dá)式,找出其中包含的所有0-9的數(shù)字,并按照從小到大輸出。
思路和代碼首先將數(shù)字和英文表示列出來:
0 zero 1 one 2 two 3 three 4 four 5 five 6 six 7 seven 8 eight 9 nine
粗略一看,我們知道有許多字母只在一個(gè)英文數(shù)字中出現(xiàn),比如z只出現(xiàn)在zero中。因此對(duì)于這種字母,它一旦出現(xiàn),就意味著該數(shù)字一定出現(xiàn)了。
因此一輪過濾后可以得出只出現(xiàn)一次的字母如下:
0 zero -> z 1 one 2 two -> w 3 three 4 four -> u 5 five 6 six -> x 7 seven 8 eight 9 nine
再對(duì)剩下的數(shù)字字母過濾出只出現(xiàn)一次的字母:
1 one 3 three -> r 5 five -> f 7 seven -> s 8 eight -> g 9 nine
最后對(duì)one和nine分別用o和i進(jìn)行區(qū)分即可。因此可以得出如下代碼:
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上面的代碼未免寫的太繁瑣了,對(duì)其進(jìn)一步優(yōu)化可以得到如下代碼:
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(); }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/74207.html
摘要:復(fù)雜度思路重建,應(yīng)為要按進(jìn)行排序,所以用來決定下一個(gè)要出去的值。 Leetcode[332] Reconstruct Itinerary Given a list of airline tickets represented by pairs of departure andarrival airports [from, to], reconstruct the itinerary ...
摘要:反轉(zhuǎn)比較法復(fù)雜度時(shí)間空間思路回文數(shù)有一個(gè)特性,就是它反轉(zhuǎn)后值是一樣的。代碼逐位比較法復(fù)雜度時(shí)間空間思路反轉(zhuǎn)比較有可能會(huì)溢出,但我們遍歷每一位的時(shí)候其實(shí)并不用保存上一位的信息,只要和當(dāng)前對(duì)應(yīng)位相等就行了。首先,負(fù)數(shù)是否算回文。 Palindrome Number Determine whether an integer is a palindrome. Do this witho...
摘要:來自大神的解答,只能膜拜。題目確定了至少有一條的行程不存在分支情況,一定有相同的最終目的地,而且對(duì)于多條的行程,要選取字母順序較小的一條。 Problem Given a list of airline tickets represented by pairs of departure and arrival airports [from, to], reconstruct the i...
摘要:這里要注意的是的用法。所以記住,用可以從自動(dòng)分離出數(shù)組。跳過第一個(gè)元素并放入數(shù)組最快捷語句建立的用意記錄處理過的結(jié)點(diǎn)并按處理所有結(jié)點(diǎn)和自己的連接下面先通過判斷,再修改的符號(hào)的順序,十分巧妙更輕便的解法 Problem Design an algorithm and write code to serialize and deserialize a binary tree. Writin...
摘要:利用棧我們可以存儲(chǔ)外圍層已持有的字符串以及應(yīng)當(dāng)展開的次數(shù)。用棧的思路來寫要求思路更加嚴(yán)謹(jǐn),以免出現(xiàn)邏輯錯(cuò)誤。這里需要額外注意的是,如果當(dāng)前該括號(hào)外圍存在父元素,則我們應(yīng)當(dāng)將父元素的計(jì)數(shù)和已有字符串壓入棧中。 題目要求 Given an encoded string, return its decoded string. The encoding rule is: k[encoded_...
閱讀 3614·2020-12-03 17:42
閱讀 2780·2019-08-30 15:54
閱讀 2241·2019-08-30 15:44
閱讀 585·2019-08-30 14:08
閱讀 983·2019-08-30 14:00
閱讀 1118·2019-08-30 13:46
閱讀 2801·2019-08-29 18:33
閱讀 2951·2019-08-29 14:11