描述
字符 数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内
例子
思路
- switch比dict快一些些
- IV IX XL XC CD CM集中特殊情况,如果当前的罗马数字小于后面的罗马数字,就减去当前的罗马数字,否则加上当前的罗马数字
答案 - python (无switch)
class Solution:
def romanToInt(self, s: str) -> int:
d={'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000}
num=0
for i in range(len(s)):
if i+1<=len(s)-1 and d[s[i+1]]>d[s[i]]:
num -= d[s[i]]
else:
num += d[s[i]]
return num
- c++
* 用字典
class Solution {
public:
int romanToInt(string s) {
unordered_map<char,int> dict={{'I',1},{'V',5},{'X',10},{'L',50},{'C',100},{'D',500},{'M',1000}};
int num=0;
for (int i=0; i<s.size(); i++)
{
if (i+1<=s.size()-1 && dict[s[i+1]]>dict[s[i]])
num -= dict[s[i]];
else
num += dict[s[i]];
}
return num;
}
};
* 用switch
int romanToInt(string s) {
int num=0;
int now=0;
int pre=0;
for (int i=0; i<s.size(); i++)
{
switch(s[i]) {
case 'I': now = 1; break;
case 'V': now = 5; break;
case 'X': now = 10; break;
case 'L': now = 50; break;
case 'C': now = 100; break;
case 'D': now = 500; break;
case 'M': now = 1000; break;
}
if (pre<now) num-=pre*2;
num+=now;
pre=now;
}
return num;
}
};