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
相关产品推荐
相关产品推荐

