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

Python实现将数组零值移至末尾及现有异常代码问题排查

数组零值后移实现问题解答

现有代码的问题原因

你提供的代码运行出现元素重复、结果异常的核心原因有4点:

  • 索引越界访问:数组x的长度为8,有效索引范围是0~7,内层循环for j in range(i,8)中j最大取到7,执行x[j] = x[j+1]时会访问x[8],超出数组边界
  • 末尾未补零:每次将零值后面的元素前移后,没有把数组末尾空出来的位置赋值为0,导致末尾的非零元素(示例中的3)会被多次复制到前一位,出现重复
  • 遍历起始位错误:外层循环从i=1开始遍历,完全遗漏了索引0位置为0的场景
  • 漏判移动后的新元素:每次将零值后移后,当前i位置已经被替换为后面的新元素,直接进入下一轮i递增的遍历,会漏掉连续零值的处理

正确实现方式

最优实现:双指针法(时间复杂度O(n),空间复杂度O(1))

x = [5, 10, 0, 4, 0, 8, 0, 3]
# 慢指针记录下一个非零元素要放置的位置
non_zero_idx = 0
# 快指针遍历整个数组筛选非零元素
for i in range(len(x)):
    if x[i] != 0:
        x[non_zero_idx] = x[i]
        non_zero_idx += 1
# 所有非零元素已移到数组前部,剩余位置统一补零
for i in range(non_zero_idx, len(x)):
    x[i] = 0
# 输出结果
for num in x:
    print(num)

运行输出结果为:5 10 4 8 3 0 0 0

基于原思路的修正版

如果你要保留原本逐个前移元素的实现逻辑,修正后代码如下:

x = [5, 10, 0, 4, 0, 8, 0, 3]
n = len(x)
i = 0
while i < n:
    if x[i] == 0:
        # 前移时只遍历到倒数第二个元素,避免越界
        for j in range(i, n-1):
            x[j] = x[j+1]
        # 末尾补零
        x[-1] = 0
    else:
        # 只有当前位置是非零元素才向后遍历,避免漏判移动过来的零值
        i += 1
# 输出结果
for num in x:
    print(num)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 01:54:03