题目
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"
答案
简化过的答案
class Solution {
String[] map = {"Twenty","Thirty","Forty","Fifty","Sixty","Seventy","Eighty","Ninety",
"Hundred","Thousand","Million","Billion"};
String[] map_1_19 = {"", "One","Two","Three","Four","Five","Six","Seven","Eight",
"Nine","Ten","Eleven","Twelve","Thirteen","Fourteen",
"Fifteen","Sixteen","Seventeen","Eighteen","Nineteen"};
public String numberToWords(int num) {
if(num == 0) return "Zero";
return recur(num);
}
public String recur(int num) {
StringBuilder sb = new StringBuilder();
String strnum = Integer.toString(num);
int len = strnum.length(), prefix, prefix_len, divider, index;
if(len == 10) {divider = 1000000000;index = 11;}
else if(len < 10 && len >= 7) {divider = 1000000; index = 10;}
else if(len < 7 && len >= 4) {divider = 1000; index = 9;}
else if(len == 3){divider = 100; index = 8;}
else if(num < 100 && num > 19){divider = 10; index = (num / divider) - 2;}
else {return map_1_19[num];}
prefix = num / divider;
if(divider == 10) sb.append(map[index]);
else sb.append(recur(prefix)).append(" ").append(map[index]);
String ret = recur(num % divider);
if(!ret.equals("")) sb.append(" ").append(ret);
return sb.toString();
}
}
未简化的答案(对每个case有很详细的记录)
class Solution {
String[] map = {"","","Hundred","Thousand","","","Million","","","Billion"};
String[] map_tens = {"Ten","Eleven","Twelve","Thirteen","Fourteen","Fifteen","Sixteen","Seventeen","Eighteen","Nineteen"};
String[] map_gt_tens = {"","Twenty","Thirty","Forty","Fifty","Sixty","Seventy","Eighty","Ninety"};
String[] map_sm_tens = {"One","Two","Three","Four","Five","Six","Seven","Eight","Nine"};
public String numberToWords(int num) {
if(num == 0) return "Zero";
return recur(num);
}
public String recur(int num) {
StringBuilder sb = new StringBuilder();
String strnum = Integer.toString(num);
int len = strnum.length();
int prefix, prefix_len;
if(len == 10) {
// Billion
prefix = num / 1000000000;
String prefix_repr = recur(prefix);
sb.append(prefix_repr);
sb.append(" ");
sb.append(map[9]);
String ret = recur(num % 1000000000);
if(!ret.equals("")) {
sb.append(" ");
sb.append(ret);
}
}
else if(len < 10 && len >= 7) {
// Million
prefix = num / 1000000;
String prefix_repr = recur(prefix);
sb.append(prefix_repr);
sb.append(" ");
sb.append(map[6]);
String ret = recur(num % 1000000);
if(!ret.equals("")) {
sb.append(" ");
sb.append(ret);
}
}
else if(len < 7 && len >= 4) {
// Thousand
prefix = num / 1000;
String prefix_repr = recur(prefix);
sb.append(prefix_repr);
sb.append(" ");
sb.append(map[3]);
String ret = recur(num % 1000);
if(!ret.equals("")) {
sb.append(" ");
sb.append(ret);
}
}
else if(len == 3) {
// Hundred
prefix = num / 100;
String prefix_repr = recur(prefix);
sb.append(prefix_repr);
sb.append(" ");
sb.append(map[2]);
String ret = recur(num % 100);
if(!ret.equals("")) {
sb.append(" ");
sb.append(ret);
}
}
else if(len == 2) {
prefix = num / 10;
if(prefix == 1) {
sb.append(map_tens[num - 10]);
}
else {
sb.append(map_gt_tens[prefix - 1]);
String ret = recur(num % 10);
if(!ret.equals("")) {
sb.append(" ");
sb.append(ret);
}
}
}
else if(len == 1) {
// Do nothing in case of 0, for exampty 30 = thirty + [nothing]
if(num != 0) {
sb.append(map_sm_tens[num - 1]);
}
}
return sb.toString();
}
}