羅馬數題目的思路探討與源碼
羅馬數的題目如下圖,核心是將輸入的羅馬數字符串進行轉化,得到一個十進制的數字。
本人在看到該題目後,認爲羅馬數的轉化本質上只需要注意相鄰兩個字符串的大小即可,所以本人建立了一個與輸入字符串等長的方向列表,該列表中的值+1代表當前的字符對應的數值大於等於右邊的值,當列表中的值爲-1代表當前的字符對應的數值小於右邊的值。由此得到一個值爲+1或者-1的列表。
#噴火龍與水箭龜
def numberMean(stw):
if(stw=='I'):
return 1
elif(stw=='V'):
return 5
elif(stw=='X'):
return 10
elif(stw=='L'):
return 50
elif(stw=='C'):
return 100
elif(stw=='D'):
return 500
elif(stw=='M'):
return 1000
else:
return 0
st = 'MCDLXXVI'
stLen = len(st)
opearateArr=[]
resFinal=0
for ik in range(stLen):
opearateArr.append(0)
if(stLen==1):
resFinal=numberMean(st)
else:
for ij in range(stLen-1):
if(numberMean(st[ij])>=numberMean(st[ij+1])):
opearateArr[ij]=1
else:
opearateArr[ij]=-1
opearateArr[stLen-1]=1
for ir in range(stLen):
resFinal = resFinal+opearateArr[ir]*numberMean(st[ir])
print(resFinal)
numberMean函數是一個將字符串轉換爲數值的函數。在上述代碼中,對於else後面的第一個for循環是我說的思路,但需要注意最後一個字符串,它所對應的方向值一定是+1,即加法算子。最終輸入是 ‘MCDLXXVI’,得到結果1476是正確的。
需要注意的是,本代碼是作者的測試代碼,如需放到LeetCode上運行,需要將函數調用時加上self前綴纔可以。
最終結果如下:
最終的結果雖然通過了,但是速度太慢,所以顯然本人的代碼太冗餘,可以把一些步驟合到一起,這樣會快許多。
#噴火龍與水箭龜
def numberMean(stw):
if(stw=='I'):
return 1
elif(stw=='V'):
return 5
elif(stw=='X'):
return 10
elif(stw=='L'):
return 50
elif(stw=='C'):
return 100
elif(stw=='D'):
return 500
elif(stw=='M'):
return 1000
else:
return 0
st = 'MCDLXXVI'
stLen = len(st)
opearateArr=[]
resFinal=0
for ik in range(stLen):
opearateArr.append(numberMean(st[ik]))
if(stLen==1):
resFinal=numberMean(st)
else:
for ij in range(stLen-1):
if(opearateArr[ij]<opearateArr[ij+1]):
opearateArr[ij]=-opearateArr[ij]
for ir in range(stLen):
resFinal = resFinal+opearateArr[ir]
print(resFinal)
最終結果如上圖,本人的思路應該還不是最優的,希望朋友們能夠多多指教。