将非负整数 num
转换为其对应的英文表示。
示例 1:
输入:num = 123 输出:"One Hundred Twenty Three"
方法一:好好学英语
总所周知,在英语中我们读书是三个一位的,那么对于每三位数 [1, 999],我们可以单独写一个函数来处理每三位。为了更方便的构建字符串,我们将 0-20, 20 - 90, 1e3 - 1e6的词组储存在三个数组中,构建时对数进行除法并取余来获取对应词汇。
private static final String[] basic = {
"Zero",
"One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten",
"Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen"
};
private static final String[] upper = {
"", "", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety"
};
private static final String[] higher = {
"Billion", "Million", "Thousand", ""
};
/**
* @param value 1 -> 999
* */
private static String numberToWord(int value) {
StringBuilder builder = new StringBuilder();
if (value >= 100) { // 100 -> 999
builder.append(basic[value/100]).append(" ").append("Hundred");
value %= 100;
}
if (value >= 20) { // 20 -> 99
if (builder.length() != 0) builder.append(" ");
builder.append(upper[value/10]);
value %= 10;
}
if (value > 0) {
if (builder.length() != 0) builder.append(" ");
builder.append(basic[value]);
}
return builder.toString();
}
那么对于输入范围在 [0, 0x7fffffff] 的数,其最大值的次幂为 1e9,那么我们可以对输入的数进行 1e9 1e6 1e3 的枚举,对符合要求的整数构建字符串并去除结尾空格,输出。
public String numberToWords(int num) {
if (num == 0) return basic[0];
StringBuilder builder = new StringBuilder();
for (int i = (int) 1e9, j = 0; i >= 1; i /= 1000, ++ j) {
if (num < i) continue;
builder.append(numberToWord(num / i)).append(" ").append(higher[j]).append(" ");
num %= i;
}
while (builder.charAt(builder.length()-1) == ' ') builder.deleteCharAt(builder.length()-1);
return builder.toString();
}