罗马数题目的思路探讨与源码
罗马数的题目如下图,核心是将输入的罗马数字符串进行转化,得到一个十进制的数字。
本人在看到该题目后,认为罗马数的转化本质上只需要注意相邻两个字符串的大小即可,所以本人建立了一个与输入字符串等长的方向列表,该列表中的值+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)
最终结果如上图,本人的思路应该还不是最优的,希望朋友们能够多多指教。