LeetCode273 Integer to English Words

将数字转化成英语单词。

分析单词可以发现每1000之间是有规律的。

class Solution
{
public:
    string numberToWords(int num)
    {
        if(num==0)
            return "Zero";
        string bases[]= {"","Thousand","Million","Billion"};
        string a[]= {"","One","Two","Three","Four","Five","Six","Seven","Eight","Nine"};
        string b1[]= {"Ten","Eleven","Twelve","Thirteen","Fourteen","Fifteen","Sixteen","Seventeen","Eighteen","Nineteen"};
        string b2[]= {"","","Twenty","Thirty","Forty","Fifty","Sixty","Seventy","Eighty","Ninety"};
        int i=0;
        vector<string> vec;
        while(num)
        {
            int val=num%1000;
            if(i!=0&&val!=0)
                vec.push_back(bases[i]);
            int z=val%10,y=val/10%10,x=val/100;
            if(y==1)
                vec.push_back(b1[z]);
            else
            {
                if(z!=0)
                    vec.push_back(a[z]);
                if(y!=0)
                    vec.push_back(b2[y]);
            }
            if(x!=0)
                vec.push_back(string(a[x]+" Hundred"));
            num/=1000;
            ++i;
        }
        string result;
        for(int i=vec.size()-1; i>=0; --i)
        {
            if(i!=vec.size()-1)
                result+=" ";
            result+=vec[i];
        }
        return result;
    }
};

同理也可以实现单词转int数字。

strtok是字符串切割神器。

class Solution
{
public:
    int wordsToNumber(string words)
    {
        if(words.empty()||words=="Zero")
            return 0;
        char cwords[words.size()+1];
        strcpy(cwords,words.c_str());
        map<string,int> base{make_pair("Thousand",1000),make_pair("Million",1000000),make_pair("Billion",1000000000)};
        map<string,int> num{make_pair("One",1),make_pair("Two",2),make_pair("Three",3),make_pair("Four",4),make_pair("Five",5),make_pair("Six",6),make_pair("Seven",7),make_pair("Eight",8),make_pair("Nine",9),make_pair("Ten",10),
make_pair("Eleven",11),make_pair("Twelve",12),make_pair("Thirteen",13),make_pair("Fourteen",14),make_pair("Fifteen",15),make_pair("Sixteen",16),
make_pair("Seventeen",17),make_pair("Eighteen",18),make_pair("Nineteen",19),make_pair("Twenty",20),make_pair("Thirty",30),make_pair("Forty",40),
make_pair("Fifty",50),make_pair("Sixty",60),make_pair("Seventy",70),make_pair("Eighty",80),make_pair("Ninety",90)};
        int result=0;
        int val=0;
        char *p=strtok(cwords," ");
        while(p!=NULL)
        {
            string word(p);
            map<string,int>::iterator it;
            if((it=base.find(word))!=base.end())
            {
                result+=val*it->second;
                val=0;
            }
            else if((it=num.find(word))!=num.end())
            {
                val+=it->second;
            }
            else if(word=="Hundred")
                val*=100;
            p=strtok(NULL," ");
        }
        result+=val;
        return result;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值