方法一:对特殊情况直接写条件筛选
class Solution:
def romanToInt(self, s: str) -> int:
dic = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M':1000}
res = 0
n = len(s) - 1
for i in range(n, -1, -1): # 前闭后开
if i == n:
res += dic[s[i]]
elif (s[i] == 'I' and s[i + 1] in ['V', 'X']) or \
(s[i] == 'X' and s[i + 1] in ['L', 'C'] ) or \
(s[i] == 'C' and s[i + 1] in ['D', 'M']):
res -= dic[s[i]]
else:
res += dic[s[i]]
# print(s[i], res)
return res
方法二:模拟
若存在小的数字在大的数字的左边的情况,根据规则需要减去小的数字。对于这种情况,我们也可以将每个字符视作一个单独的值,若一个数字右侧的数字比它大,则将该数字的符号取反。
class Solution:
def romanToInt(self, s: str) -> int:
dic = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M':1000}
res = 0
for i in range(len(s) - 1):
if dic[s[i]] < dic[s[i + 1]]:
res -= dic[s[i]]
else:
res += dic[s[i]]
res += dic[s[-1]]
return res