lc276 Integer to Word

一道比较难coding的题目。首先了解一下十进制数对应的数字具体读法。一般是3位一逗号,代表着不同的数量级别,比如1234567读作

One Million Two Hundred Thirty Four Thousand Five Hundred Sixty Seven

.后三位是567,即five hundred sixty seven,这个三位数在最终的表示中也是这样的一个形式。234代表tow hundred thirty four。在最终表示过程中也是这样的形式。不同的是,后面加了一个thousand,代表对应的数量级。所以需要加入数量级的东西。1即代表001三位中,1,直接用one表示即可。综上我们可以以3位一间隔的形式将整个数字拆分开来。

需要注意的点如下:不妨设需要读的数为num。

num<20时,需要单独的列出来

num%10==0时,同样可以直接表示出来。

其余的num为3位数的情况时,需要按照数字位来运算。

具体代码如下形式

class Solution {
    int hundred=100;
    int thousand=1000;
    int million=1000000;
    int billion=1000000000;
    HashMap<Integer,String>map=new HashMap<>();
    public String numberToWords(int num){
        String[]num20={"Zero","One","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Eleven",
        "Twelve","Thirteen","Fourteen","Fifteen","Sixteen","Seventeen","Eighteen","Nineteen"};
        String[]num10={"Twenty","Thirty","Forty","Fifty","Sixty","Seventy","Eighty","Ninety"};
        map.put(hundred,"Hundred");
        map.put(thousand,"Thousand");
        map.put(million,"Million");
        map.put(billion,"Billion");
        for (int i=0;i<20;i++){
            map.put(i,num20[i]);
        }
        for (int i=20,j=0;i<100;i+=10,j++){
            map.put(i,num10[j]);
        }
        String res="";
        for (int k=1000000000;k>=100;k/=1000){
            if (num>=k){
                res+=" "+get3(num/k)+" "+map.get(k);
                num=num%k;
            }
        }
        if(num!=0){
             res+=" "+get3(num);
        }
       
        if (res.isEmpty()){
            res+=" "+map.get(0);
        }
        return res.substring(1);
    }
    public String get3(int num){
        String res="";
        if (num>=hundred){
            res+=" "+map.get(num/hundred)+" "+map.get(hundred);
            num%=hundred;
        }
       if (num!=0){
            if (num<20){
                res+=" "+map.get(num);
            }else if (num%10==0){
                res+=" "+map.get(num);
            }else{
                res+=" "+map.get(num/10*10)+" "+map.get(num%10);
            } 
        }
        return res.substring(1);//每次res第一个字符都是空格,所以需要将开始的那个空格去掉
    }

}

里面有很多小细节。比如每次res拼接字符串之前需要添加“ ”,最后输出时,控制最初的空格,所以使用子串的形式获取字符串。同时。需要判断num是否为0控制边界条件。 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值