题目
题解
C++
class Solution {
public:
int convert(char c)
{
switch(c)
{
case 'I':return 1;
case 'V':return 5;
case 'X':return 10;
case 'L':return 50;
case 'C':return 100;
case 'D':return 500;
case 'M':return 1000;
}
return 0;
}
int romanToInt(string s) {
int res=0;
for(int i=0;i<s.size();)
{
int temp=convert(s[i]);
//小的数字在大的数字的左边
if(temp<convert(s[i+1]))
{
res+=convert(s[i+1])-temp;
i+=2;
}
//小数字在右边
else
{
res+=temp;
i++;
}
}
return res;
}
};
python
改进思路:
-
左减右加,小的数字在大的数字的左边,减去小数字,如:IV;在右边,则加上小数字,如:VI
-
利用字典映射dict,上面c++中也可以用map,将罗马数字与整数一一对应,就不用写函数convert了
class Solution:
def romanToInt(self, s: str) -> int:
# 映射
mapping={
'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000
}
res=0
for i in range(len(s)):
temp=mapping.get(s[i])
# 小数字在左边
if i<len(s)-1 and temp<mapping.get(s[i+1]):
res-=temp
# 小数字在右边
else:
res+=temp
return res