题目源自于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,否则程序会崩。所以调用之前要做好判断。