gpt4 book ai didi

python - for 循环存储旧变量值?

转载 作者:行者123 更新时间:2023-12-01 07:26:54 25 4
gpt4 key购买 nike

我正在尝试从 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)

INPUT: "PAYPALISHIRING" 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

Output: "PINALSIGYAHRGPIG"

Expected: "PINALSIGYAHRPI"

最佳答案

问题似乎出在这个 block 上:

    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)

关于python - for 循环存储旧变量值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57399894/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com