我正在尝试从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”
答案 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
,它将引发错误