这是python3中的完整代码:
def rainwater(array):
max_value = max(array)
count = 0
for a in range(0, max_value):
temp = array
for i in range(0, len(temp)):
if temp[i] >= 1:
print(temp)
temp[i] = 1 # somehow this line always changes temp[i] to 0 instead of 1
array[i] = array[i] - temp[i]
array = temp
for i in range(0, len(temp)):
if temp[i] == 1:
del temp[:i]
break
for i in range(0, len(temp) - 1, -1):
if temp[i] == 1:
del temp[i:]
break
if len(temp) <= 1:
return count
for i in range(0, len(temp)):
if temp[i] == 0:
count = count + 1
return count
# driver program -> should return 6
print(rainwater([0,1,0,2,1,0,1,3,2,1,2,1]))
问题出现在第9行。不知道如何对这个问题进行分类,但我不能在我的生活中弄清楚这里缺少什么。提前谢谢。
答案 0 :(得分:1)
问题
问题在于将temp指定为数组
使用temp = array
,您实际上没有两个列表。赋值只是复制对列表的引用,而不是实际列表,因此temp和array在赋值后都引用相同的列表。
temp = array
for i in range(0, len(temp)):
if temp[i] >= 1:
print(temp)
temp[i] = 1 # somehow this line always changes temp[i] to 0 instead of 1
array[i] = array[i] - temp[i]
array = temp
在上面的代码中,更改为temp[i]
更改array[i]
,
所以
temp[i] = 1 # sets temp[i] = array[i] = 1
array[i] = array[i] - temp[i] # array[i] = tempa[i] = 1-1
因此temp [i]为0而不是1
如何解决
您可以使用copy
,deepcopy
或slicing
将数组复制到temp
以下是使用slicing
<强>代码强>
def rainwater(array):
max_value = max(array)
count = 0
for a in range(0, max_value):
temp = array[:]
for i in range(0, len(temp)):
if temp[i] >= 1:
print(temp)
temp[i] = 1 # somehow this line always changes temp[i] to 0 instead of 1
array[i] = array[i] - temp[i]
array = temp[:]
for i in range(0, len(temp)):
if temp[i] == 1:
del temp[:i]
break
for i in range(0, len(temp) - 1, -1):
if temp[i] == 1:
del temp[i:]
break
if len(temp) <= 1:
return count
for i in range(0, len(temp)):
if temp[i] == 0:
count = count + 1
return count
# driver program -> should return 6
print(rainwater([0,1,0,2,1,0,1,3,2,1,2,1]))
答案 1 :(得分:1)
此行将您的值设置为0:
array[i] = array[i] - temp[i]
原因是数组和temp是相同的对象。所以x - x总是为零。
我认为你假设第5行的代码会复制数组:
temp = array
但事实并非如此。这使temp
和array
引用相同的数组。如果您确实需要数组的副本,请执行以下操作:
temp = array[:]
此外,如果您正在制作副本,您可能还想修复第11行。
我建议你阅读更多关于通过引用和值传递变量的信息。