我正在解决将数组中的所有零移动到最后的问题。 我知道以前有人问过这个问题,但我不是在寻找解决方案 - 我的问题是我无法以合乎逻辑的方式思考停止循环,因为我在 Python 上实现了它并且它永远循环。 这就是我所拥有的:
def move_zeros(array):
i=0
while i<len(array):
if array[i] == 0:
for j in range(i, len(array)-1):
array[j] = array[j+1]
array[len(array)-1] = 0
else:
i+=1
return array
我现在唯一能想到的就是在 if-else 之外添加一个计数器,并在计数器等于数组长度时使用 break,如下所示:
def move_zeros(array):
i=0
count = 0
while i<len(array):
if array[i] == 0:
for j in range(i, len(array)-1):
array[j] = array[j+1]
array[len(array)-1] = 0
else:
i+=1
count += 1
if count == len(array):
break
return array
但我知道这在某种程度上是作弊,因为我使用了 python 并且知道它会永远持续下去,而且我不想在线搜索问题,因为我不想看到完整的解决方案......有什么帮助吗?谢谢。
答案 0 :(得分:1)
从概念上讲,想象一下,不是将零放在数组的末尾,而是删除它们,将其他所有内容移回原处。在这种情况下,当您没有找到零时,您仍然将 i
增加 1,但是当您找到零时,“数组长度”也会变小 1。让我们定义一个新变量 {{ 1}} 跟踪这个假想长度;零仍然会交换到数组的末尾,但是当 limit
达到此限制时循环结束(因为数组的其余部分是您在早期迭代中“删除”的所有零)。
i
此循环可证明在 def move_zeros(array):
i = 0
limit = len(array)
while i < limit:
if array[i] == 0:
for j in range(i, limit - 1):
array[j] = array[j + 1]
array[limit - 1] = 0
limit -= 1
else:
i += 1
return array
次迭代中终止,因为在每次迭代中,len(array)
增加或 i
减少,使它们靠得更近 1,最终循环终止,因为它们变得相等。