罗马数字转整数:link
1.方法一
从正向可以观察到,每一个独立的匹配都是贪心的匹配,为了避免使用大量的if 嵌套结构使用查表的方式。
class Solution {
public:
int romanToInt(string s) {
map<string, int> roman2int = { {"I", 1},{ "II", 2 },{ "III", 3 },{ "IV", 4 },{ "V", 5 },
{ "VI", 6 },{ "VII", 7 },{ "VIII", 8 },{ "IX", 9 },{ "X", 10 },
{ "XX", 20 },{ "XXX", 30 },{ "XL", 40 },{ "L", 50 },{ "LX", 60 },
{ "LXX", 70 },{ "LXXX", 80 },{ "XC", 90 },{ "C", 100 },{ "CC", 200 },
{ "CCC", 300 },{ "CD", 400 },{ "D", 500 },{ "DC", 600 },{ "DCC", 700 },
{ "DCCC", 800 },{ "CM", 900 },{ "M", 1000 }};
int ret = 0;
int i = 0;
while(i < s.size()){
int j = i;
while(j < s.size() && roman2int.count(s.substr(i, j - i + 1))){
j++;
}
ret += roman2int[s.substr(i, j - i)];
i = j;
}
return ret;
}
};
2.方法2
注意到可以通过比较一个字符与后面一个字符代表的数字的大小来判断该为正还是为负,同时最后一个字符一定为正,所以从后面开始处理。
class Solution {
public:
int romanToInt(string s) {
map<char, int> roman2int = { {'I', 1},{ 'V', 5 },{ 'X', 10 },{ 'L', 50 },{ 'C', 100 },
{'D', 500}, {'M', 1000} };
int ret = roman2int[s.back()];
for(int i = s.size() - 2; i >= 0; --i){
ret += (roman2int[s[i]] < roman2int[s[i+1]]) ?
-roman2int[s[i]] : roman2int[s[i]];
}
return ret;
}
};