# 羅馬數字包含以下七種字元: 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 。
## 通常情況下,羅馬數字中小的數字在大的數字的右邊。但也存在特例,例如 4 不寫做 iiii,而是 iv。數字 1 在數字 5 的左邊,所表示的數等於大數 5 減小數 1 得到的數值 4 。同樣地,數字 9 表示為 ix。這個特殊的規則只適用於以下六種情況:
## i 可以放在 v (5) 和 x (10) 的左邊,來表示 4 和 9。 iv=4 ix=9
# x 可以放在 l (50) 和 c (100) 的左邊,來表示 40 和 90。 xl=40 xc=90
# c 可以放在 d (500) 和 m (1000) 的左邊,來表示 400 和 900。cd=400 cm=900
# 給定乙個整數,將其轉為羅馬數字。輸入確保在 1 到 3999 的範圍內。
#
拿到這道題時,我首先想的是建立乙個roman數列,裡面從小到大儲存著所有的羅馬字元,同時建立乙個字典從小到大儲存著羅馬字元以及其對應的數量大小。如下所示:
roman = ['i', 'v', 'x', 'l', 'c', 'd', 'm']
roman_value =
解題思路則是,將拿到的羅馬數字用for迴圈取值,一次取兩個。若是取到的第乙個字元比第二個字元小,則加上第二個字元代表的值減去第乙個字元代表的值(如ix=10-1=9),否則加上第二個數字的值。然後再判斷第二個字元和第三個字元......
首次解題時,我寫出了如下演算法:
def romantoint(s):
res = 0
for i in s: # i:第乙個數
if s.index(i) != len(s) + 1:
j = s[s.index(i) + 1] #出錯 由於x出現了兩次,當取i='x'時,index(i)會預設取第乙個'x'的索引
if roman_value[i] < roman_value[j]:
res += roman_value[j] - roman_value[i]
res -= roman_value[j]
# 由於第二次迴圈還是會迴圈到j,相當於再加了一次j,所以直接先減去以抵消
else:
res += roman_value[i]
else:
res += roman_value[i]
return res
在轉換『mxcix』,也就是羅馬字元的1099時,輸出的答案為1079。然後我debug出了乙個我無法解決bug。
我使用了.index的方法,也就是根據每次迴圈取到的具體字元 i 來反推這個字元在原字串 s 中的索引,並且根據這個索引+1的值來取到下乙個值.但是我在使用這種方法的時候沒有考慮到字元可能重複出現的情況.就比如在轉換『mxcix』時,當 i 取到第二個x(高亮x)時, s.index(i)任然是第乙個x的索引,導致程式出錯.
這個bug以我現在的知識無法解決,於是我在查閱一些資料後寫出了改進演算法:
def romantoint(s):
res = 0
for i,v in enumerate(s): # i:索引 v:值
if i != len(s)-1:
j = s[i + 1] #j: s中以i+1為索引的值
if roman_value[v] < roman_value[j]:
res += roman_value[j] - roman_value[v]
res -= roman_value[j]
else:
res += roman_value[v]
else:
res += roman_value[v]
return res
主要改進是使用了enumerate(列舉)這個方法,它的作用是分別返回索引以及值.這樣就在迴圈的一開始確定了索引和值,而不是通過值反推索引,這樣會因為重複出現的值出bug.
反思:enumerate真好真好用啊
演算法練習 羅馬數字轉整數與整數轉羅馬數字
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。通常情況下,羅...
演算法 羅馬數字轉整數
羅馬數字包含以下七種字元 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。通常情況下,羅馬數字中小的數字在大的數字的...
演算法 羅馬數字轉整數
羅馬數字包含以下七種字元 i,v,x,l,c,d和m。例如,羅馬數字 2 寫做 ii 即為兩個並列的 1。12 寫做 xii 即為 x ii 27 寫做 xxvii,即為 xx v ii 通常情況下,羅馬數字中小的數字在大的數字的右邊。但也存在特例,例如 4 不寫做 iiii,而是 iv。數字 1 ...