13. Roman to Integer
题目
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
解析:
- 给定 “DCXXI”字符串,从左向右走,左边是高位
- 需要用到map数据结构,来将罗马数字的字母转化为对应的整数值,因为输入的一定是罗马数字,那么我们只要考虑两种情况即可:
- 第一,如果当前数字是最后一个数字,或者之后的数字比它小的话,则加上当前数字;第二,其他情况则减去这个数字
class Solution_13 {
public:
int romanToInt(string s) { // "DCXXI" "MCMXCVI"
int ret = 0;
unordered_map<char, int> mp{ { 'I', 1 }, { 'V', 5 }, { 'X', 10 }, { 'L', 50 }, { 'C', 100 }, { 'D', 500 }, { 'M', 1000 } };
ret = mp[s[s.size()-1]];
for (int i = s.size()-2; i >=0; --i) // 从后往前走 //或者从前往后走,都是当前和之后的数字比较
{
if (mp[s[i]] >= mp[s[i+1]])
{
ret += mp[s[i]];
}
else
{
ret -= mp[s[i]]; //"CM":100-100=900
}
}
return ret;
}
};
- 当前和之前的数字比较,则需要减去之前多加的一次
- 我们也可以每次跟前面的数字比较,如果小于等于前面的数字,我们先加上当前的数字,如果大于的前面的数字,我们加上当前的数字减去二倍前面的数字,这样可以把在上一个循环多加数减掉
class Solution {
public:
int romanToInt(string s) {
int res = 0;
unordered_map<char, int> m{{'I', 1}, {'V', 5}, {'X', 10}, {'L', 50}, {'C', 100}, {'D', 500}, {'M', 1000}};
for (int i = 0; i < s.size(); ++i) {
if (i == 0 || m[s[i]] <= m[s[i - 1]]) res += m[s[i]];
else res += m[s[i]] - 2 * m[s[i - 1]];
}
return res;
}
};
题目来源