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