273. 整数转换英文表示

118 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

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"

解题思路

  1. 首先将所有可能出现的单词,使用map将数字和单词映射起来,任何num都可以由这些单词组合起来,字符串里面只可能存在这些单词。例如1对应one,10对应ten这样。
  2. 对于"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();
    }
}