You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python数组移零函数异常求助:部分零未被移至末尾

问题排查:move_zeros函数遗漏部分零的原因及修复

你的代码逻辑存在关键漏洞:当执行lst.pop(x)移除零元素时,数组中x位置之后的所有元素会向前移动一位,但你随后仍执行x +=1,这会跳过原本位于x+1位置、现在移到x位置的元素,导致部分零被遗漏。

举个典型例子,输入[0,0,1]的执行过程:

  1. x=0,发现元素是0,pop(0)后数组变为[0,1],append(0)后变成[0,1,0],x直接递增到1。
  2. x=1,元素是1,不处理,x递增到2。
  3. x=2,元素是0,pop(2)后数组变为[0,1],append(0)后变成[0,1,0],循环结束。
    最终结果是[0,1,0],而非预期的[1,0,0]——核心原因就是第一个零被处理后,第二个零移到了x=0的位置,但x直接跳到了1,错过了这个零。

修复后的代码

只需要调整x的递增逻辑:只有当当前元素不是零时,才递增x;遇到零并处理后,保持x不变,继续检查当前位置(因为后续元素已前移)。

def move_zeros(lst):
    x = 0 
    while x < len(lst):
        if lst[x] == 0:
            lst.pop(x)
            lst.append(0)
            # 弹出元素后后续元素前移,不递增x,继续检查当前位置
        else:
            x += 1
    return lst

验证测试用例

  • 输入[0, 2, 0, 0],执行后得到[2, 0, 0, 0],符合预期。
  • 输入[9, 0, 9, 1, 2, 1, 1, 3, 1, 9, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0],输出与预期一致:[9, 9, 1, 2, 1, 1, 3, 1, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]。
  • 输入[9, 0, 0, 9, 1, 2, 0, 1, 0, 1, 0, 3, 0, 1, 9, 0, 0, 0, 0, 9],输出也符合预期。

更高效的替代实现

如果不需要修改原数组,也可以用列表推导式分离非零元素和零,再拼接,逻辑更清晰,时间复杂度为O(n):

def move_zeros(lst):
    non_zeros = [num for num in lst if num != 0]
    return non_zeros + [0] * (len(lst) - len(non_zeros))

内容的提问来源于stack exchange,提问作者senkyte

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 17:10:29