LeetCode # 13 罗马数字转整数
思路 1
- 利用字典记录对应关系
- 遍历整个字符串
- 查找前后两个字符是不是出现了特殊情况
- 无特殊情况直接加
代码 1
class Solution:
def romanToInt(self, s: str) -> int:
res = 0
Dict = {"I" : 1, "V" : 5, "X" : 10, "L" : 50, "C" : 100, "D" : 500, "M" : 1000, "IV": 4, "IX": 9, "XL": 40, "XC": 90, "CD":400, "CM": 900}
i = 0
while(i < len(s)):
if( i != len(s) - 1 ):
sx = s[i: i+2]
else:
sx = None
if(Dict.get(sx) == None):
res += Dict[s[i]]
else:
i += 1
res += Dict[sx]
i += 1
return res
代码精简版
class Solution:
def romanToInt(self, s: str) -> int:
d = {'I':1, 'IV':3, 'V':5, 'IX':8, 'X':10, 'XL':30, 'L':50, 'XC':80, 'C':100, 'CD':300, 'D':500, 'CM':800, 'M':1000}
return sum(d.get(s[max(i-1, 0):i+1], d[n]) for i, n in enumerate(s))
作者:QQqun902025048
链接:https://leetcode-cn.com/problems/roman-to-integer/solution/2-xing-python-on-by-knifezhu/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
改进思路
来源 LeetCode:
其实只要每次比较后一个和前一个的值的大小关系即可:
前值小于后值,减去前值
前值大于或等于后值,加上前值
最后一个值必然是加上的
class Solution:
def romanToInt(self, s: str) -> int:
d = {'I':1, 'V':5, 'X':10, 'L':50, 'C':100, 'D':500, 'M':1000}
PreNum = d[s[0]]
res = 0
for i, sx in enumerate(s):
val = d[sx]
if(val > PreNum):
res += val - 2*PreNum
else:
res += val
PreNum = val
return res