1、模拟
我们能想到的最简单的方法就是从第一位开始向后遍历,当遇到满足题目中提到的特殊情况时进行特殊处理,否则就继续加上相应的值。
class Solution {
public:
int romanToInt(string s) {
int res = 0;
for (int i = 0; i < s.size(); ++i) {
if (s[i] == 'I') {
if (s[i + 1] == 'V') {
res += 4;
++i;
continue;
} else if (s[i + 1] == 'X') {
res += 9;
++i;
continue;
} else {
res += 1;
continue;
}
} else if (s[i] == 'X') {
if (s[i + 1] == 'L') {
res += 40;
++i;
continue;
} else if (s[i + 1] == 'C') {
res += 90;
++i;
continue;
} else {
res += 10;
continue;
}
} else if (s[i] == 'C') {
if (s[i + 1] == 'D') {
res += 400;
++i;
continue;
} else if (s[i + 1] == 'M') {
res += 900;
++i;
continue;
} else {
res += 100;
continue;
}
} else if (s[i] == 'V') {
res += 5;
continue;
} else if (s[i] == 'L') {
res += 50;
continue;
} else if (s[i] == 'D') {
res += 500;
continue;
} else if (s[i] == 'M') {
res += 1000;
continue;
}
}
return res;
}
};
2、模拟优化
我们可以从后向前进行遍历,并记录当前遇到过最大的数字。因为小数在右大数在左:1、因此当当前的数大于等于我们遇到过的最大值时,说明不是特殊情况,我们直接进行累加;2、当当前数字小于我们遇到的最大值时,说明这属于特殊情况,我们需要从当前值中减去这个较小值即可。最后为了方便我们的处理,我们可以使用哈希表进行查询进一步加快速度。
class Solution {
public:
int romanToInt(string s) {
int res = 0, temp_max = INT_MIN;
unordered_map<char, int> hs{{'I', 1},
{'V', 5},
{'X', 10},
{'L', 50},
{'C', 100},
{'D', 500},
{'M', 1000}};
for (int i = s.size() - 1; i >= 0; --i) {
int value = hs[s[i]];
if (value >= temp_max) {
res += value;
temp_max = value;
} else
res -= value;
}
return res;
}
};