小知识,大挑战!本文正在参与“程序员必备小知识”创作活动
273. 整数转换英文表示
将非负整数 num 转换为其对应的英文表示。
示例 1:
输入:num = 123
输出:"One Hundred Twenty Three"
示例 2:
输入:num = 12345
输出:"Twelve Thousand Three Hundred Forty Five"
示例 3:
输入:num = 1234567
输出:"One Million Two Hundred Thirty Four Thousand Five Hundred Sixty Seven"
示例 4:
输入:num = 1234567891
输出:"One Billion Two Hundred Thirty Four Million Five Hundred Sixty Seven Thousand Eight Hundred Ninety One"
解题思路
- 首先将所有可能出现的单词,使用map将数字和单词映射起来,任何num都可以由这些单词组合起来,字符串里面只可能存在这些单词。例如1对应one,10对应ten这样。
- 对于"Thousand","Million","Billion"这三个特殊单位,在英文表示中存在规律,1000以上的基数词的表示法:先从右至左数,每三位数加一个逗号(即以此把数目分为若干段)。第一个逗号前的数为thousand(千),第二个逗号前的数为million(百万),第三个逗号前的数为billion(十亿)。因此我们只需要每3个一组进行分组,对分组内的3个字符进行解析,再把"Thousand","Million","Billion"分别添加到每个分组的末尾。
代码
class Solution {
Map<Integer, String> one = new HashMap<Integer, String>() {
{
put(1, "One");
put(2, "Two");
put(3, "Three");
put(4, "Four");
put(5, "Five");
put(6, "Six");
put(7, "Seven");
put(8, "Eight");
put(9, "Nine");
}
};
Map<Integer, String> two = new HashMap<Integer, String>() {
{
put(11, "Eleven");
put(12, "Twelve");
put(13, "Thirteen");
put(14, "Fourteen");
put(15, "Fifteen");
put(16, "Sixteen");
put(17, "Seventeen");
put(18, "Eighteen");
put(19, "Nineteen");
}
};
Map<Integer, String> twoH = new HashMap<Integer, String>() {
{
put(10, "Ten");
put(20, "Twenty");
put(30, "Thirty");
put(40, "Forty");
put(50, "Fifty");
put(60, "Sixty");
put(70, "Seventy");
put(80, "Eighty");
put(90, "Ninety");
}
};
String[] unit=new String[]{"Thousand ","Million ","Billion "};
public String numberToWords(int num) {
if (num == 0) return "Zero";
StringBuilder sb = new StringBuilder();
int idx=0;
sb.append(countThree(num % 1000));
num /= 1000;
while (num!=0)
{
if (num % 1000 != 0)
sb.insert(0, countThree(num % 1000) + unit[idx]);
num /= 1000;
idx++;
}
return sb.deleteCharAt(sb.length()-1).toString();
}
public String countThree(int num) {
StringBuilder sb = new StringBuilder();
if (num >= 100) {
sb.append(one.get(num / 100)).append(" ").append("Hundred ");
num %= 100;
}
if (two.containsKey(num)) {
sb.append(two.get(num)).append(" ");
return sb.toString();
}
if (twoH.containsKey(num)) {
sb.append(twoH.get(num)).append(" ");
return sb.toString();
}
if (num > 20)
sb.append(twoH.get((num / 10) * 10)).append(" ");
if (num > 0)
sb.append(one.get(num % 10)).append(" ");
return sb.toString();
}
}