一道比较难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控制边界条件。