Python数组移零函数异常求助:部分零未被移至末尾
问题排查:move_zeros函数遗漏部分零的原因及修复
你的代码逻辑存在关键漏洞:当执行lst.pop(x)移除零元素时,数组中x位置之后的所有元素会向前移动一位,但你随后仍执行x +=1,这会跳过原本位于x+1位置、现在移到x位置的元素,导致部分零被遗漏。
举个典型例子,输入[0,0,1]的执行过程:
- x=0,发现元素是0,pop(0)后数组变为
[0,1],append(0)后变成[0,1,0],x直接递增到1。 - x=1,元素是1,不处理,x递增到2。
- 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
相关产品推荐
相关产品推荐

