解题思路:
1、从右往左反向遍历
2、对比当前数字Num(i)和Num(i+1)的大小
3、正常情况下左边比右边大(或相等), 则做“加法”(右边第一个数字永远做加法)
4、如果遇到特殊情况(左边比右边小),则做“减法”
例如MCMXCIV,从右往左依次遍历:
V +5 第一个数字,永远做加法
I -1 比右边小,做减法
C +100 比右边大,做加法
X -10 比右边小,做减法
M +1000 比右边大,做加法
C -100 比右边小,做减法
M +1000 比右边大,做加法
结果全部累加,即可得到答案1994。
public:
int romanToInt(string s) {
int sum = 0;
int n = 0;
int lastn = 0;
// 从右往左反向遍历
for (int i=s.size()-1; i>=0; i--) {
if (s[i] == 'I') n = 1;
else if (s[i] == 'V') n = 5;
else if (s[i] == 'X') n = 10;
else if (s[i] == 'L') n = 50;
else if (s[i] == 'C') n = 100;
else if (s[i] == 'D') n = 500;
else if (s[i] == 'M') n = 1000;
// 不是首个, 且数字比右边的小, 则属于特殊规则, 做减法, 其余情况做加法
if (sum != 0 && n < lastn) {
n = -n;
}
lastn = n;
sum += n;
}
return sum;
}
};