将罗马数字字符串转换为阿拉伯整形数 Roman to Integer

142 篇文章 20 订阅
45 篇文章 0 订阅

题目源自于leetcode,和前一道是正好相反的计算。

另一道题在http://blog.csdn.net/ojshilu/article/details/12836795

思路:需要进行字符串的匹配,但是罗马数字并不是前/后缀编码,暂时没有想到好的方法。所以就枚举吧。


代码:

class Solution {
public:
    int romanToInt(string s) {
        string cost[][10] = {{"","I","II","III","IV","V","VI","VII","VIII","IX"},
                             {"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"},
                             {"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"},
                             {"","M","MM","MMM",""}};
		int value[] = {1,10,100,1000};
        int result = 0;
        int n = s.length()-1;
        int idx = 0;
        while(n>=0)
        {
            if(n>=3 && s.substr(n-3,4) == cost[idx][8] )
            {   
                result += 8*value[idx];  
                n-=4; 
            }
            else if(n>=2 && s.substr(n-2,3) == cost[idx][3] )
            {
                result += 3*value[idx];
                n-=3;
            }
            else if(n>=2 &&  s.substr(n-2,3) == cost[idx][7] )
            {
                result += 7*value[idx];
                n-=3;
            }                
            else if(n>=1 &&  s.substr(n-1,2) == cost[idx][2] )
            {
                result += 2*value[idx];
                n-=2;
            }
            else if(n>=1 && s.substr(n-1,2) == cost[idx][4] )
            {
                result += 4*value[idx];
                n-=2;
            }  
            else if(n>=1 &&  s.substr(n-1,2) == cost[idx][6] )
            {
                result += 6*value[idx];
                n-=2;
            }
            else if(n>=1 &&  s.substr(n-1,2) == cost[idx][9] )
            {
                result += 9*value[idx];
                n-=2;
            }
            else if( s.substr(n,1) == cost[idx][1] )
            {
                result += 1*value[idx];
                n--;
            }
            else if(s.substr(n,1) == cost[idx][5] )
            {
                result += 5*value[idx];
                n--;
            }
            idx++;
        }
        return result;
    }
};

注意:string类型取子字符串的时候,怎么取?用substr函数。其第一个参数不可以越界、也不可以小于0,否则程序会崩。所以调用之前要做好判断。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值