经典的双指针移动零问题
题目要求
给定数组,把所有 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 元素相对顺序,是考试经典模板题。
浙公网安备 33010602011771号