将非负整数 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"

 

提示:

  • 0 <= num <= 231 - 1
Related Topics
  • 递归
  • 数学
  • 字符串

  • 👍 177
  • 👎 0
  • 今天每日一题

    随便写下
    一个需要知道的基本知识点,英文和中文中的差别
    中文中可以理解为4位一段,

    从个到千
    从万到千万
    从亿到千亿
    但是英文中不是这样的,英文中是按照3位一段的计数法,比如例子
    1234567891,我们有某些时候看到的表达方式是这样的
    1 , 234 , 567 , 891

    7 Thousand
    4 Million
    1 Billion
    对于小于3位的部分,就很简单了,就是 X hundred XX这样的结构

    那么思路就是这样的了

    1. 每3位处理一次,这样每次除以1000取余来处理这部分数据,然后再处理除以1000之后取整的数字
    2. 百位直接按1-9取英文再加Hundred,如果没有百位,则跳过
    3. 100以下的部分,1-19单独处理,大于等于20的,按照整10部分+个位数部分处理转换

    class Solution {
        public String numberToWords(int num) {
            if (num ==0){
                return "Zero";
            }
            String[] arr1 = new String[]{"","Thousand","Million","Billion"};
            String[] arr2 = new String[]{"Hundred"};
            String[] arr3 = new String[]{"","One","Two","Three","Four","Five","Six","Seven","Eight","Nine"};
            String[] arr4 = new String[]{"Ten","Eleven","Twelve","Thirteen","Fourteen","Fifteen","Sixteen","Seventeen","Eighteen","Nineteen"};
            String[] arr5 = new String[]{"","","Twenty","Thirty","Forty","Fifty","Sixty","Seventy","Eighty","Ninety"};
            int idx1 = 0;
            ArrayList<String> list = new ArrayList<>();
            while (num != 0){
                int tmp = num % 1000;
                num = num / 1000;
                int hundred = tmp / 100;
                tmp = tmp % 100;
                StringBuffer sb2 = new StringBuffer();
                if (hundred>0){
    //                System.out.print(arr3[hundred]+" "+arr2[0]+" ");
                    sb2.append(arr3[hundred]).append(" ").append(arr2[0]).append(" ");
                }
                if (tmp>=20){
    //                System.out.print(arr5[tmp/10] + " " + arr3[tmp%10] + " ");
                    sb2.append(arr5[tmp/10]).append(" ");
                    if (tmp%10>0){
                        sb2.append(arr3[tmp%10]).append(" ");
                    }
                }else if (tmp < 10 && tmp > 0){
    //                System.out.print(arr3[tmp%10] + " ");
                    sb2.append(arr3[tmp%10]).append(" ");
                }else if (tmp>0){
    //                System.out.print(arr4[tmp-10] + " ");
                    sb2.append(arr4[tmp-10]).append(" ");
                }
    //            System.out.println(arr1[idx1]);
                if (sb2.length()>0){
                    sb2.append(arr1[idx1]).append(" ");
                }
                idx1++;
                list.add(0,sb2.toString());
            }
            StringBuffer sb = new StringBuffer();
            for (String s : list) {
    //            System.out.println(s);
                sb.append(s);
            }
            String a = sb.toString();
            while (a.charAt(a.length()-1) == ' '){
                a = a.substring(0,a.length()-1);
            }
            return a;
        }
    }

    拓展小知识来源百度
    1至10无规律可循: one、two、three、four、five、six、seven、eight、nine、ten;
    11至19 :eleven、twelve、thirteen、fourteen、fifteen、sixteen、seventeen、eighteen、 nineteen;
    从20至99:整数的几十中除了twenty(二十)、thirty(三十)、forty(四十)、fifty(五十)、eighty(八十)为特殊形式外,sixty(六十)、seventy(七十)、ninety(九十)都是其个位数形式后添加后缀-ty构成。
    百位数个数基数词形式加“hundred”,表示几百,在几十几与百位间加上and。
    第四条一般认为是英式表达中会用到,本题中都没有and,一开始做的时候感觉有点怪怪的
    另外还有一些其他的细节性的表达,比如2000这种的结尾加only表示整。