問題分析
1、羅馬數字特點
一般情況下大的字母排在前面,小的字母排在後面,此時進行的是加法(如: VI=5+1=6);特殊情況:小的字母排在前面,大的字母排在後面,此時進行的是減法(如:IV=5-1=4)。
一般情況 + 特殊情況(映射關係》數據類型dict):
roman = {
'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
}
2、字符串解析
輸入的是字符串,所以可以使用for循環進行迭代。一般情況下,字符串迭代每次只能獲取到一個字母。
如果這些字母剛好全都是(I, V, X, L, C, D, M)裏面的,那麼只要把結果相加即可。
但是如果包含(IV, IX, XL, XC, CD, CM)裏面的任意一個怎麼辦?當然是希望既能取到前一個值,同時也能取到後一個值,這樣就可以對兩個值進行比較,判斷是否需要進行減法計算。循環在Python裏面有:
(1)for循環
正序:
class Solution(object):
def roman_to_int(self, s):
"""
:type s: str
:rtype: int
"""
roman = {
'I': 1,
'V': 5,
'X': 10,
'L': 50,
'C': 100,
'D': 500,
'M': 1000,
}
total = 0
prev = 0
for i in range(len(s)):
curr = roman.get(s[i])
if prev < curr:
total -= curr - 2*prev
else:
total += curr
return total
(2)while
class Solution(object):
def roman_to_int(self, s):
"""
:type s: str
:rtype: int
"""
roman = {
'I': 1,
'V': 5,
'X': 10,
'L': 50,
'C': 100,
'D': 500,
'M': 1000,
}
total = 0
i = 0
prev = 0
while i < len(s):
curr = roman.get(s[i])
if prev < curr:
total += curr - 2*prev
else:
total += curr
i = i+1
prev = curr
return total
時間複雜度分析
O(n)。
Python知識點
[1]遍歷:for循環,while循環,這兩種循環總是可以互相切換的,即一般來說,可以用for循環實現的,那麼一般也能用while循環實現。
[2]序列類型的切片操作。序列類型的遍歷,往往也會涉及到正序和倒序,倒序可以使用切片操作符快速構造。
[3]內建函數enumerate(), range()。這兩個函數循環的時候往往會用到。
參考資料
[1]leetcode, https://leetcode.com/problems/roman-to-integer/