LeetCode每日一题之LeetCode273_整数转换英文表示

LeetCode273. 整数转换英文表示

LeetCode273

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

题解:

这道题我的整体思路就是首先定义一个Map集合来存储需要的数字以及其对应的英文,然后我们以三个数为一组进行分割(从后往前),然后对这三个数组成的一组进行英文的转换,并将其结果保存在一个List集合中,最后,可能会出现三个数不满的情况,我们在对其进行单独的处理,最后将List集合中的字符串进行再拼接,得到最后的结果集。

我们以示例4举例,思路过程如下所示:

在这里插入图片描述

代码实现:

public class LeetCode273 {
    public static void main(String[] args) {
        System.out.println(new LeetCode273().numberToWords(1000000));

    }

    //定义一个辅助的map以及对应百,千,百万,10亿的单位变量
    Map<Integer,String> map = new HashMap<>();
    String hundred = "Hundred";
    String billion = "Billion";
    String million = "Million";
    String thousand = "Thousand";
    public String numberToWords(int num) {
        //如果num为0,则直接返回结果
        if(num == 0) {
            return "Zero";
        }
        //map存储值
        map.put(1,"One");map.put(2,"Two");map.put(3,"Three");map.put(4,"Four");map.put(5,"Five");map.put(6,"Six");map.put(7,"Seven");map.put(8,"Eight");map.put(9,"Nine");map.put(10,"Ten");
        map.put(11,"Eleven");map.put(12,"Twelve");map.put(13,"Thirteen");map.put(14,"Fourteen");map.put(15,"Fifteen");map.put(16,"Sixteen");map.put(17,"Seventeen");map.put(18,"Eighteen");map.put(19,"Nineteen");
        map.put(20,"Twenty");map.put(30,"Thirty");map.put(40,"Forty");map.put(50,"Fifty");map.put(60,"Sixty");map.put(70,"Seventy");map.put(80,"Eighty");map.put(90,"Ninety");
        //list存储最后的的结果
        List<String> list = new ArrayList<>();
        int index = 0;
        //每三数为一组,用sum记录每三个数所组成的和
        int sum = 0;
        int pow = 1;
        while(num > 0) {
            sum = (num % 10) * pow + sum;
            num = num / 10;
            pow = pow * 10;
            ++index;
            //存储第1位到第3位的三个数组成的和: 单位无
            if (index == 3) {
                String val = find(sum);
                list.add(val);
                //重置sum和pow的值
                sum = 0;
                pow = 1;
            }
            //存储第4位到第6位的三个数组成的和: 单位为Thousand
            if (index == 6) {
                String val = find(sum);
                if (!val.equals("")) {
                    list.add(val + " " + thousand + " ");
                }
                //重置sum和pow的值
                sum = 0;
                pow = 1;
            }
            //存储第7位到第9位的三个数组成的和: 单位为Million
            if (index == 9) {
                String val = find(sum);
                if (!val.equals("")) {
                    list.add(val + " " + million + " ");
                }
                //重置sum和pow的值
                sum = 0;
                pow = 1;
            }
        }

        //退出while循环,如果此时sum不为0,则说明不满百位,我们根据此时index的值的范围存储最后应该是哪个范围的值
        if (sum != 0) {
            if(index < 3) {
                String val = findSub(sum);
                list.add(val);
            }else if(index < 6) {
                String val = findSub(sum) + " " + thousand + " ";
                list.add(val);
            }else if (index < 9) {
                String val = findSub(sum) + " " + million + " ";
                list.add(val);
            }else {
                String val = map.get(sum) + " " + billion + " ";
                list.add(val);
            }
        }

        //最后进行结果集的拼接...
        StringBuilder res = new StringBuilder();
        for (int i = list.size() - 1; i >= 0; i--) {
            res.append(list.get(i));
        }
        return res.toString().trim();
    }



    //找到不足百位对应的英文
    private String findSub(int sum) {
        //如果此时sum是map中已经存在的key,则直接返回其对应的value值
        if (sum <= 20 || sum % 10 == 0) {
            return map.get(sum);
        }
        //否则我们依次取出其十位和个位,进行对应的英文的求解
        StringBuilder sb = new StringBuilder();
        int sw = sum / 10 * 10;   //取整的十位
        int gw = sum - sw;         //个位数
        if (sw > 0) {
            sb.append(map.get(sw));
        }
        if (gw > 0) {
            sb.append(" ").append(map.get(gw));
        }
        return sb.toString().trim();
    }


    //找到足百位对应的英文
    private String find(int sum) {
        StringBuilder sb = new StringBuilder();
        int b = sum / 100 * 100;  //取整的百位数,例如123,则为100
        int bw = sum / 100;       //百位对应的数字,例如123,则为1
        int sw = sum - b;         //剩余的十位数字,例如123,则为23
        if (sw <= 20 || sw % 10 == 0) {
            if (bw > 0) {
                sb.append(map.get(bw)).append(" ").append(hundred);
            }
            if (sw > 0) {
                sb.append(" ").append(map.get(sw));
            }
        }else {
            int s = sw / 10 * 10;   //取整的十位数
            int gw = sw - s;        //个位数
            if (bw > 0) {
                sb.append(map.get(bw)).append(" ").append(hundred);
            }
            if (s > 0) {
                sb.append(" ").append(map.get(s));
            }
            if (gw > 0) {
                sb.append(" ").append(map.get(gw));
            }
        }
        //因为我们的前后可能多添加了空格,这里我们统一使用trim()去除多余的空格
        return sb.toString().trim();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值