For循环存储旧的变量值?

时间:2019-08-07 17:55:47

标签: python python-3.x

我正在尝试从LeetCode实现ZigZag。不知何故,在第二次递归调用中,“ addElements”中的第二个for循环保留了上次调用中的值。为什么会这样?

我已经分享了下面的输出-我的问题是关于beg和end如何保持相同的值直到3,然后beg移至预期的6,但end保持为3。

https://leetcode.com/problems/zigzag-conversion/

class Solution:
    def convert(self, s: str, numRows: int) -> str:
        row = [''] * len(s)
        self.s = s
        self.numRows = numRows
        self.final_grid = []

        for i in range(numRows):
            self.final_grid.append(list(row))

        self.addElements(0, 0)

        final_arr = []
        for i in self.final_grid:
            final_arr += i

        final_word = ''
        for i in final_arr:
            if i != "":
                final_word += i

        return (final_word)



    def addElements(self, count, column):
        print(column, "beg")
        for i in range(self.numRows):
            if count > len(self.s) - 1:
                break
            self.final_grid[i][column] = self.s[count]
            count += 1

        for i in range(1, self.numRows - 1):
            if count > len(self.s) - 1:
                break

            self.final_grid[self.numRows - i - 1][column + i] = self.s[count]
            count += 1
            print(column, "end")
            self.addElements(count, column + self.numRows - 1)
  

输入:“付款” 4

STDOUT:
0 beg
0 end
3 beg
3 end
6 beg
3 end **why does this stay at 3?
6 beg
0 end 
3 beg
3 end
6 beg
3 end
6 beg
  

输出:“ PINALSIGYAHRGPIG”

  

预期:“ PINALSIGYAHRPI”

2 个答案:

答案 0 :(得分:1)

问题似乎出在以下地方:

    for i in range(1, self.numRows - 1):
        if count > len(self.s) - 1:
            break

        self.final_grid[self.numRows - i - 1][column + i] = self.s[count]
        count += 1
        print(column, "end")
        self.addElements(count, column + self.numRows - 1)

在这里,您要为循环中的每个元素递归 。您可能是说:

def addElements(self, count, column):
    for i in range(self.numRows):
        if count >= len(self.s):
            return # <-- return instead of break

        self.final_grid[i][column] = self.s[count]
        count += 1

    for i in range(1, self.numRows - 1):
        if count >= len(self.s):
            return # <-- return instead of break

        self.final_grid[self.numRows-i-1][column+i] = self.s[count]
        count += 1

    self.addElements(count, column + self.numRows - 1)
    #^^^ move this outside of the loop

在进行了这些更改之后,输出将匹配预期的"PINALSIGYAHRPI"。代码仍然有点尴尬,各种条件都被奇怪地放置了,作为前置/后置条件有双重职责,所以我考虑重新编写。

注意:我只看了这个问题,但我不保证这段代码将在其余测试中正常工作。例如,它使用了大量的内存,因此可能有一种方法可以在不创建大型n x m数组的情况下构建结果。还有其他一些低效率的地方,例如逐个字符地构建结果数组,然后从数组中构建结果字符串(因为字符串是不可变的,所以以二次时间运行)。

代替:

    final_arr = []
    for i in self.final_grid:
        final_arr += i

    final_word = ''
    for i in final_arr:
        if i != "":
            final_word += i

    return (final_word)

使用:

    return "".join(map("".join, self.final_grid))

代替:

    row = [''] * len(s)

考虑:

    row = [''] * ((len(s) // 2) + 1)

答案 1 :(得分:0)

因为for循环的最后一个元素存储了最后一个变量。 如果您尝试在不重新分配新值的情况下使用该变量,则不要使用该变量类型del variable,它将引发错误