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();}
}