273. 整數轉換英文表示
將非負整數 num 轉換為其對應的英文表示。
示例 1:輸入:num = 123
輸出:"One Hundred Twenty Three"
示例 2:輸入:num = 12345
輸出:"Twelve Thousand Three Hundred Forty Five"
示例 3:輸入:num = 1234567
輸出:"One Million Two Hundred Thirty Four Thousand Five Hundred Sixty Seven"
示例 4:輸入:num = 1234567891
輸出:"One Billion Two Hundred Thirty Four Million Five Hundred Sixty Seven Thousand Eight Hundred Ninety One"
解題思路
- 首先將所有可能出現的單詞,使用map將數字和單詞映射起來,任何num都可以由這些單詞組合起來,字符串里面只可能存在這些單詞。例如1對應one,10對應ten這樣。
- 對于"Thousand",“Million”,“Billion"這三個特殊單位,在英文表示中存在規律,1000以上的基數詞的表示法:先從右至左數,每三位數加一個逗號(即以此把數目分為若干段)。第一個逗號前的數為thousand(千),第二個逗號前的數為million(百萬),第三個逗號前的數為billion(十億)。因此我們只需要每3個一組進行分組,對分組內的3個字符進行解析,再把"Thousand”,“Million”,"Billion"分別添加到每個分組的末尾。
代碼
class Solution {Map<Integer, String> one = new HashMap<Integer, String>() {{put(1, "One");put(2, "Two");put(3, "Three");put(4, "Four");put(5, "Five");put(6, "Six");put(7, "Seven");put(8, "Eight");put(9, "Nine");}};Map<Integer, String> two = new HashMap<Integer, String>() {{put(11, "Eleven");put(12, "Twelve");put(13, "Thirteen");put(14, "Fourteen");put(15, "Fifteen");put(16, "Sixteen");put(17, "Seventeen");put(18, "Eighteen");put(19, "Nineteen");}};Map<Integer, String> twoH = new HashMap<Integer, String>() {{put(10, "Ten");put(20, "Twenty");put(30, "Thirty");put(40, "Forty");put(50, "Fifty");put(60, "Sixty");put(70, "Seventy");put(80, "Eighty");put(90, "Ninety");}};String[] unit=new String[]{"Thousand ","Million ","Billion "};public String numberToWords(int num) {if (num == 0) return "Zero";StringBuilder sb = new StringBuilder();int idx=0;sb.append(countThree(num % 1000));num /= 1000;while (num!=0){if (num % 1000 != 0)sb.insert(0, countThree(num % 1000) + unit[idx]);num /= 1000;idx++;}return sb.deleteCharAt(sb.length()-1).toString();}public String countThree(int num) {StringBuilder sb = new StringBuilder();if (num >= 100) {sb.append(one.get(num / 100)).append(" ").append("Hundred ");num %= 100;}if (two.containsKey(num)) {sb.append(two.get(num)).append(" ");return sb.toString();}if (twoH.containsKey(num)) {sb.append(twoH.get(num)).append(" ");return sb.toString();}if (num > 20)sb.append(twoH.get((num / 10) * 10)).append(" ");if (num > 0)sb.append(one.get(num % 10)).append(" ");return sb.toString();}
}