将零移到列表末尾

时间:2021-04-17 23:06:26

标签: python algorithm

我正在解决将数组中的所有零移动到最后的问题。 我知道以前有人问过这个问题,但我不是在寻找解决方案 - 我的问题是我无法以合乎逻辑的方式思考停止循环,因为我在 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 并且知道它会永远持续下去,而且我不想在线搜索问题,因为我不想看到完整的解决方案......有什么帮助吗?谢谢。

1 个答案:

答案 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,最终循环终止,因为它们变得相等。

相关问题