字串題目編碼時真是令人頭疼。本題可以將千位、百位、十位、個位分別分割出來,再按照其對應的對映變更為阿拉伯數字。列出每個位上的所有可能情況後,可以發現如下規律:
從左至右該字母首次出現
標誌著阿拉伯數字進入的位級
c/d進入百位
x/l進入十位
v/i進入個位
判斷首次出現的方法:該字母出現了,並且該字母對應的阿拉伯位級還沒有被確定,並且當前考察的位級在該字母對應的位級的左邊(考慮9:ix)
class
solution
:def
romantoint
(self, s:
str)
->
int:
thousand =
"" hundred =
"" ten =
"" one =
"" turn =
0for i in
range
(len
(s)):if
(s[i]
=='c'
or s[i]
=='d'
)and hundred ==
""and turn<1:
turn =
1elif
(s[i]
=='x'
or s[i]
=='l'
)and ten ==
""and turn<2:
turn =
2elif
(s[i]
=='v'
or s[i]
=='i'
)and one ==
""and turn<3:
turn =
3if turn ==0:
thousand = thousand + s[i]
elif turn ==1:
hundred = hundred + s[i]
elif turn ==2:
ten = ten + s[i]
else
: one = one + s[i]
dic =
res = dic[one]
+ dic[ten]
+ dic[hundred]
+ dic[thousand]
return res
76ms 13.7mb
題解的思路更加具有一般性,本質上來說,單個字元對應的數字,若比右邊的字元大,那麼為正,若比右邊的字元小,那麼為特殊情況,為負。
class
solution
:def
romantoint
(self, s:
str)
->
int:
dic =
pre = dic[s[0]
]sum=0
for i in
range(1
,len
(s))
:if presum=
sum- pre
else
:sum
=sum
+ pre
pre = dic[s[i]
]sum
=sum
+ pre
return
sum
52ms 13.8mb leetcode 13 羅馬數字轉整數
羅馬數字包含以下七種字元 i,v,x,l,c,d和m。字元 數值i 1 v 5 x 10 l 50 c 100 d 500 m 1000例如,羅馬數字 2 寫做ii,即為兩個並列的 1。12 寫做xii,即為x ii。27 寫做xxvii,即為xx v ii。通常情況下,羅馬數字中小的數字在大的數字...
leetcode 13 羅馬數字轉整數
羅馬數字包含以下七種字元 i,v,x,l,c,d和m。字元數值i 1 v 5 x 10 l 50 c 100 d 500 m 1000例如,羅馬數字 2 寫做ii,即為兩個並列的 1。12 寫做xii,即為x ii。27 寫做xxvii,即為xx v ii。通常情況下,羅馬數字中小的數字在大的數字的...
Leetcode 13 羅馬數字轉整數
羅馬數字包含以下七種字元 i,v,x,l,c,d 和 m。字元 數值 i 1v 5 x 10 l 50 c 100 d 500 m 1000 例如,羅馬數字 2 寫做 ii 即為兩個並列的 1。12 寫做 xii 即為 x ii 27 寫做 xxvii,即為 xx v ii 通常情況下,羅馬數字中小...