这个地方有一个关于罗马数字的规律:
通常情况下,罗马数字中小的数字在大的数字的右边。若输入的字符串满足该情况,那么可以将每个字符视作一个单独的值,累加每个字符对应的数值即可。
例如 XXVII 可视作 X+X+V+I+I=10+10+5+1+1=27
若存在小的数字在大的数字的左边的情况,根据规则需要减去小的数字。对于这种情况,我们也可以将每个字符视作一个单独的值,若一个数字右侧的数字比它大,则将该数字的符号取反。
例如X - I + V = 10 -1 +5 =14
链接:https://leetcode-cn.com/problems/roman-to-integer/solution/luo-ma-shu-zi-zhuan-zheng-shu-by-leetcod-w55p/
来源:力扣(LeetCode)
代码如下:
用一个map来确定一下对应关系:
然后判断一下右边的数字是比前面的数字大小(不能用左边的数字来判断右边的,左边罗马数字的符号是由右边的数字决定的)
class Solution {
private:
map<char,int>sybolvalue = {
{'I',1},
{'V',5},
{'X',10},
{'L',50},
{'C',100},
{'D',500},
{'M',1000},
};
public:
int romanToInt(string s) {
int n = s.length();
int endvalue=0;
for(int i=0;i<n;i++)
{
int value = sybolvalue[s[i]];
if(i<n-1&&value < sybolvalue[s[i+1]])
{
endvalue = endvalue - value;
}
else
{
endvalue = endvalue + value;
}
}
return endvalue;
}
};