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"
思路:这道题到是不难,主要是格式转换太麻烦了!!!就针对空格的位置,我试了好久。。。。
思路是从数字从后向前分割,以三个数字为一组,对每一组进行判断。注意英文语法里1 - 19 的语法不同。
还有就是空格位置,我就是一开始没想明白,然后一点一点试出来的,痛心疾首啊.....
class Solution {
HashMap<Integer,String> B;//较大的单位,如千,百万等..
HashMap<Integer,String> M;//中等级别的单位,如11,12 等
HashMap<Integer,String> S;//最小级别的单位,如1 - 9
public void init(){
B = new HashMap<Integer,String>();
B.put(0,"");
B.put(1," Thousand");
B.put(2," Million");
B.put(3," Billion");
M = new HashMap<Integer,String>();
M.put(0,"");
M.put(1,"One");
M.put(2,"Two");
M.put(3,"Three");
M.put(4, "Four");
M.put(5,"Five");
M.put(6,"Six");
M.put(7,"Seven");
M.put(8,"Eight");
M.put(9,"Nine");
M.put(10,"Ten");
M.put(11,"Eleven");
M.put(12,"Twelve");
M.put(13,"Thirteen");
M.put(14,"Fourteen");
M.put(15,"Fifteen");
M.put(16,"Sixteen");
M.put(17,"Seventeen");
M.put(18,"Eighteen");
M.put(19,"Nineteen");
M.put(20,"Twenty");
M.put(30,"Thirty");
M.put(40,"Forty");
M.put(50,"Fifty");
M.put(60,"Sixty");
M.put(70,"Seventy");
M.put(80,"Eighty");
M.put(90,"Ninety");
M.put(100,"Hundred");
S = new HashMap<Integer,String>();
S.put(0,"");
S.put(1,"One");
S.put(2,"Two");
S.put(3,"Three");
S.put(4,"Four");
S.put(5,"Five");
S.put(6,"Six");
S.put(7,"Seven");
S.put(8,"Eight");
S.put(9,"Nine");
}
public String numberToWords(int num) {
if(num == 0) return "Zero";
init();
int seg = 1;
ArrayList<String> res = new ArrayList<String>();//保存每三个数字组成的一组数字
StringBuilder sb = new StringBuilder();
int b = 0;//控制较大单位使用
String nums = num +"";
int r = nums.length()-1;
while(r >= 0){
int l = (r - 2 > 0)?(r - 2):0;
int sub = Integer.parseInt(nums.substring(l, r+1));//subString是前闭后开区间,所以r+1
num = num / seg * seg;
if(sub >= 100){//百位
int m = sub / 100 ;
sb.append(S.get(m)+" Hundred");
sub = sub % 100;
}
if(sub != 0) sb.append(" ");
if(sub < 20 ){//十位
sb.append(M.get(sub));
sub = 0;
}else{
int m = sub / 10 * 10;
sb.append(M.get(m));
sub = sub % 10;
}
if(sub != 0) sb.append(" ");
sb.append(S.get(sub));//个位
if(Integer.parseInt(nums.substring(l, r+1))!=0){//保证1000000这种不会出现one Billion thousand 这种情况
sb.append(B.get(b));
}
b++;//控制thousand、million、billion的位置
res.add(sb.toString().trim());
sb.setLength(0);
r = r - 3;//每三个数字为一组
}
sb.setLength(0);
for(int i = res.size() - 1;i>=0; i--){
sb.append(res.get(i).trim());
if(i != 0&&res.get(i).length()!=0) sb.append(" ");
}
return sb.toString().trim();
}
}