其实这题并不难,初中英语学好的童鞋们,都知道trick是什么。但是,细节处比较多,比如说,我后来就focus在空格的增删上。
【我的思路是】
1. 建好hash表。
hash1 : 1~19,20,30,40,50,60,70,80,90 (second的值就不一一写明了)
hash2: [0,""], [1,"Thousand"], [2,"Million"}, [3,"Billion"]
2. 求出num的各个位上的数字,并按照从低位到高位的顺序,每三个数字归为一组(一个vector<int>)。将这些组放到一个大组里(vector<vector<int>>),放的次序按照hash2。
3. 从大组中,一次取出小组,识别出英文读法,注意的是,如果小组中三位都是0,这一组就为空串。确定完小组的读法,再确定是否要添加Thousand,Million之类的。
class Solution {
public:
string numberToWords(int num) {
string res;
int i,j,k;
vector<vector<int>> digits;
if(num==0) return "Zero";
vector<string>hash1(91);
vector<string>hash2(4);
hash1[1]="One";hash1[2]="Two";hash1[3]="Three";hash1[4]="Four";hash1[5]="Five";
hash1[6]="Six";hash1[7]="Seven";hash1[8]="Eight";hash1[9]="Nine";hash1[10]="Ten";
hash1[11]="Eleven";hash1[12]="Twelve";hash1[13]="Thirteen";hash1[14]="Fourteen";hash1[15]="Fifteen";hash1[16]="Sixteen";hash1[17]="Seventeen";hash1[18]="Eighteen";hash1[19]="Nineteen";
hash1[20]="Twenty";hash1[30]="Thirty";hash1[40]="Forty";hash1[50]="Fifty";hash1[60]="Sixty";hash1[70]="Seventy";hash1[80]="Eighty";hash1[90]="Ninety";
hash2[0]="";hash2[1]="Thousand";hash2[2]="Million";hash2[3]="Billion";
while(num){ // 分组啦,三个一组
vector<int> v(3,0);
for(i=2;i>=0&#i--){
v[i]=num%10;
num/=10;
}
digits.push_back(v);
}
for(i=0;i<digits.size();i++){
string str;
if(digits[i][0]!=0) str+=hash1[digits[i][0]]+" Hundred";
if(digits[i][1]==1){
str=str!=""?str+" ":str;
str+=hash1[digits[i][1]*10+digits[i][2]];
}
else if(digits[i][1]!=0){
str=str!=""?str+" ":str;
str+=hash1[digits[i][1]*10];
if(digits[i][2]!=0){
str=str!=""?str+" ":str;
str+=hash1[digits[i][2]];
}
}
else if(digits[i][2]!=0){
str=str!=""?str+" ":str;
str+=hash1[digits[i][2]];
}
if(i&&str!="") str+=" "+hash2[i];
if(str!="") res=str+" "+res;
}
res.erase(res.size()-1);
return res;
}
};