【问题标题】:How to fix 'list index out of range' error in ZigZag problem?如何修复 ZigZag 问题中的“列表索引超出范围”错误?
【发布时间】:2019-05-27 19:29:48
【问题描述】:

在使用列表方法解决之字折线问题 (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)

【问题讨论】:

  • 你理解错误信息吗?
  • @Blorgbeard 我相信是的。 rows 数组的访问超出了其初始设置。但是“行”会增加/减少以解决这个问题。我说的对吗?
  • rows 的初始容量是numrows,这似乎与len(s) 没有任何关系,那么您为什么期望rows[row] 保持在范围内呢?
  • elif(row==len(s)-1) - 那不应该是len(rows)吗?
  • 您的row 超出范围,原因是您使用len(s)(与s)而不是numRows。但它仍然是不正确的。

标签: python arrays algorithm


【解决方案1】:

错误是由于您比较了(row==len(s)-1)。现在s 是字符串,而不是行数,所以对于大于行数的字符串,最终row 会大到超出范围。

话虽如此,我们可以有效地改进代码。我们知道我们分配第 i 元素的行 ri 是一个序列 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 谜题,它被接受了(所有测试用例都成功)。

【讨论】:

    【解决方案2】:

    当使用“numRows”而不是使用len(s) 更新“row”参数时,该问题得到解决。行参数确定行进方向是向上还是向下,并且在正确更新“row”的极限情况后,越界错误消失。

    【讨论】:

      猜你喜欢
      • 2019-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-13
      • 2019-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多