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)

在这里插入图片描述
最终结果如上图,本人的思路应该还不是最优的,希望朋友们能够多多指教。

发布了23 篇原创文章 · 获赞 24 · 访问量 4507

猜你喜欢

转载自blog.csdn.net/qq_26727101/article/details/103440866