问题描述:
Convert a non-negative integer to its english words representation. Given input is guaranteed to be less than 231 - 1.
For example,
123 -> “One Hundred Twenty Three”
12345 -> “Twelve Thousand Three Hundred Forty Five”
1234567 -> “One Million Two Hundred Thirty Four Thousand Five Hundred Sixty Seven”
分析:这道题就是使用最直观的,将整数变成字符串,然后以3为单位将字符串进行切割。然后分别对每一组进行单独处理。
我最开始是将起作为整数进行处理的,可后来发现,当出现1000000时,应该写作One Million,而如果用整数的话,那输出结果会为One Million Thousand,而且似乎没有明显的方法来解决。
代码如下:276ms
public class Solution {
public String numberToWords(int num) {
String str = Integer.toString(num);
StringBuilder builder = new StringBuilder();
if(num==0)
return "Zero";
int length = str.length();
int groups = (length+2)/3;//可以分为多少组
int index = length%3;
int base = groups;
if(index==0)
index = 3;
while(base>=1){
String substr = str.substring(0,index);
if(Integer.parseInt(substr)!=0){
String tmp = parseStr(Integer.parseInt(substr));
builder.append(tmp);
switch (base){
case 2:
builder.append("Thousand ");
break;
case 3:
builder.append("Million ");
break;
case 4:
builder.append("Billion ");
break;
default:
break;
}
}
str = str.substring(index);
index = 3;
base--;
}
builder.deleteCharAt(builder.length() - 1);
return builder.toString();
}
private String parseStr(int num){
int base = 100;
StringBuilder builder = new StringBuilder();
while (base>=1){
int val = num/base;
if(val!=0) {
if (val == 1 && base == 10)
break;
switch (val){
case 1:
if(base==100) {
builder.append("One Hundred ");
}else if(base == 1)
builder.append("One ");
break;
case 2:
if(base==100) {
builder.append("Two Hundred ");
}else if(base == 10)
builder.append("Twenty ");
else
builder.append("Two ");
break;
case 3:
if(base==100){
builder.append("Three Hundred ");
}else if(base == 10)
builder.append("Thirty ");
else
builder.append("Three ");
break;
case 4:
if(base==100)
builder.append("Four Hundred ");
else if(base == 10)
builder.append("Forty ");
else
builder.append("Four ");
break;
case 5:
if(base==100)
builder.append("Five Hundred ");
else if(base==10)
builder.append("Fifty ");
else
builder.append("Five ");
break;
case 6:
if(base==100)
builder.append("Six Hundred ");
else if(base == 10)
builder.append("Sixty ");
else
builder.append("Six ");
break;
case 7:
if(base == 100)
builder.append("Seven Hundred ");
else if(base == 10)
builder.append("Seventy ");
else
builder.append("Seven ");
break;
case 8:
if(base==100)
builder.append("Eight Hundred ");
else if(base == 10)
builder.append("Eighty ");
else
builder.append("Eight ");
break;
case 9:
if(base==100)
builder.append("Nine Hundred ");
else if(base==10)
builder.append("Ninety ");
else
builder.append("Nine ");
break;
default:
break;
}
}
num %= base;
base /= 10;
}
if(num>=10 && num<=19){
switch (num){
case 10:
builder.append("Ten ");
break;
case 11:
builder.append("Eleven ");
break;
case 12:
builder.append("Twelve ");
break;
case 13:
builder.append("Thirteen ");
break;
case 14:
builder.append("Fourteen ");
break;
case 15:
builder.append("Fifteen ");
break;
case 16:
builder.append("Sixteen ");
break;
case 17:
builder.append("Seventeen ");
break;
case 18:
builder.append("Eighteen ");
break;
case 19:
builder.append("Nineteen ");
break;
default:
break;
}
}
return builder.toString();
}
}