LeetCode刷題——羅馬數

羅馬數題目的思路探討與源碼
羅馬數的題目如下圖,核心是將輸入的羅馬數字符串進行轉化,得到一個十進制的數字。
在這裏插入圖片描述
在這裏插入圖片描述
本人在看到該題目後,認爲羅馬數的轉化本質上只需要注意相鄰兩個字符串的大小即可,所以本人建立了一個與輸入字符串等長的方向列表,該列表中的值+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)

在這裏插入圖片描述
最終結果如上圖,本人的思路應該還不是最優的,希望朋友們能夠多多指教。

發佈了29 篇原創文章 · 獲贊 30 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章