LeetCode-每日一题 273. 整数转换英文表示 [Java实现] [极速]

将非负整数 num 转换为其对应的英文表示。

示例 1:

输入:num = 123
输出:"One Hundred Twenty Three"

方法一:好好学英语 

        总所周知,在英语中我们读书是三个一位的,那么对于每三位数 [1, 999],我们可以单独写一个函数来处理每三位。为了更方便的构建字符串,我们将 0-20, 20 - 90, 1e3 - 1e6的词组储存在三个数组中,构建时对数进行除法并取余来获取对应词汇。

    private static final String[] basic = {
            "Zero",
            "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten",
            "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen"
    };

    private static final String[] upper = {
            "", "", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety"
    };

    private static final String[] higher = {
            "Billion", "Million", "Thousand", ""
    };

    /**
     * @param value 1 -> 999
     * */
    private static String numberToWord(int value) {
        StringBuilder builder = new StringBuilder();
        if (value >= 100) { // 100 -> 999
            builder.append(basic[value/100]).append(" ").append("Hundred");
            value %= 100;
        }
        if (value >= 20) { // 20 -> 99
            if (builder.length() != 0) builder.append(" ");
            builder.append(upper[value/10]);
            value %= 10;
        }
        if (value > 0) {
            if (builder.length() != 0) builder.append(" ");
            builder.append(basic[value]);
        }
        return builder.toString();
    }

 那么对于输入范围在 [0, 0x7fffffff] 的数,其最大值的次幂为 1e9,那么我们可以对输入的数进行 1e9 1e6 1e3 的枚举,对符合要求的整数构建字符串并去除结尾空格,输出。

    public String numberToWords(int num) {
        if (num == 0) return basic[0];
        StringBuilder builder = new StringBuilder();
        for (int i = (int) 1e9, j = 0; i >= 1; i /= 1000, ++ j) {
            if (num < i) continue;
            builder.append(numberToWord(num / i)).append(" ").append(higher[j]).append(" ");
            num %= i;
        }
        while (builder.charAt(builder.length()-1) == ' ') builder.deleteCharAt(builder.length()-1);
        return builder.toString();
    }

                ​​​​​​​        ​​​​​​​        ​​​​​​​

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值