如何解决ZigZag问题中的“列表索引超出范围”错误?

时间:2019-05-27 19:29:48

标签: python arrays algorithm

使用列表列表方法解决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)

2 个答案:

答案 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难题,并被接受(所有测试用例均成功)。