【LeetCode】Integer to English Words

其实这题并不难,初中英语学好的童鞋们,都知道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;
    }
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值