经典的双指针移动零问题

题目要求
给定数组,把所有 0 移到末尾,非 0 保持相对顺序不变,原地操作,双指针实现。

思路(双指针标准版)
设两个指针:
慢指针 j:专门存非 0 元素的位置
快指针 i:遍历数组,寻找非 0 元素

流程:
1.i 从头走到尾,遇到非 0,就把值赋给 arr[j],然后 j++
2.遍历完后,j 及后面所有位置全部赋值为 0
3.原地修改,不开新数组,相对顺序不变,标准双指针解法

C 语言标准代码
c

include <stdio.h>

int main()
{
int n;
scanf("%d", &n);
int arr[10005];

for(int i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}

// 双指针核心
int j = 0; // 慢指针:存放非0
for(int i = 0; i < n; i++) // i 快指针遍历
{
if(arr[i] != 0)
{
arr[j] = arr[i];
j++;
}
}

// 后面全部补0
for(int i = j; i < n; i++)
{
arr[i] = 0;
}

// 输出
for(int i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}

return 0;
}

举例演示
输入:

7
0 1 0 3 12 0 5

过程:

i 扫到 1 → arr [0]=1,j=1
i 扫到 3 → arr [1]=3,j=2
i 扫到 12 → arr [2]=12,j=3
i 扫到 5 → arr [3]=5,j=4
下标 4、5、6 全部置 0

输出:

1 3 12 5 0 0 0

关键点总结
1.快指针 找非 0,慢指针 存非 0
2.先把非 0 往前覆盖,末尾统一补 0
3.原地操作,时间复杂度 O(n),空间 O(1)
4.严格保持非 0 元素相对顺序,是考试经典模板题。

posted on 2026-05-11 18:04  谢天佑  阅读(10)  评论(0)    收藏  举报