使用列表列表方法解决ZigZag问题(https://leetcode.com/problems/zigzag-conversion/)时,第6行出现列表索引超出范围错误。为什么会出现这样的错误?
def convert(self, s, numRows):
row=0
down=True
rows=[[] for i in range(numRows)]
for i in range(len(s)):
rows[row].extend(s[i])
#print(rows)
if(row==0):
down=True
elif(row==len(s)-1):
down=False
if down:
row+=1
else:
row-=1
st=[]
for k in rows:
st+=k
return ''.join(st)
答案 0 :(得分:1)
使用“ row
”而不是“ numRows
”更新“ len(s)
”参数后,该问题已解决。 row参数确定行进方向是向上还是向下,并且在正确更新极限情况“ row
”后,越界错误消失。
答案 1 :(得分:1)
该错误是由于您比较(row==len(s)-1)
而引起的。现在s
是字符串,而不是行数,因此对于大于行数的字符串,最终row
会大到超出范围。
话虽如此,我们可以有效地改进代码。我们知道分配 i 元素的行 r i 是一个序列 0,1,... ,n-1,n-2,...,0、1,... 。因此我们可以为此定义一个函数,例如:
def pingpong(n):
while True:
yield from range(n)
yield from range(n-2, 0, -1)
例如:
>>> list(islice(pingpong(3), 14))
[0, 1, 2, 1, 0, 1, 2, 1, 0, 1, 2, 1, 0, 1]
>>> list(islice(pingpong(4), 14))
[0, 1, 2, 3, 2, 1, 0, 1, 2, 3, 2, 1, 0, 1]
然后,我们可以在pingpong
函数的每一行后面附加相应的字符:
def zigzag(text, numRows):
rows = [[] for _ in range(numRows)]
for ri, c in zip(pingpong(numRows), text):
rows[ri].append(c)
return ''.join(map(''.join, rows))
哪个给了我们
>>> zigzag('PAYPALISHIRING', 3)
'PAHNAPLSIIGYIR'
>>> zigzag('PAYPALISHIRING', 4)
'PINALSIGYAHRPI'
我将上述方法提交给LeetCode难题,并被接受(所有测试用例均成功)。