这道题的思路与 整数转罗马数字 类似,仍旧是建立映射。关键点在于只有 4、9、40、90、400、900 这几个数是用两位罗马数字表示的,且是前一位数小于后一位数。所以只需要建立 1、5、10、50、100、500、1000 这几个数的映射即可,对于特殊情况利用前一位罗马数字小于后一位罗马数字这个特性来处理。
代码如下:
class Solution {
public:
int romanToInt(string s) {
//通过哈希表建立映射关系
std::map map_roman {{'M',1000}, {'D',500},{'C',100},{'L',50},{'X',10},{'V',5},{'I',1}};
int last = map_roman[s[0]];
int res = 0;
for(int i=1; i= cur){ //正常大数在前
res = res + last;
last = cur;
i++;
}
else{ //小数在前只可能是出现了4、9、40、90、400、900
res = res + cur - last;
last = map_roman[s[i+1]];
i = i + 2;
}
}
res = res + last; //注意循环退出的条件,加上last
return res;
}
};