一.题目

二.题目分析
给定一个数组,在原数组上进行修改,数组左侧为非0,右侧为0
- 约束 1 :非 0 元素原有先后相对顺序不能改变;
- 约束 2 :原地修改数组,不能新开数组复制数据(空间复杂度尽量\(O(1)\));
三.讲解算法原理
定义两个指针 cur 和 dest,cur用来遍历数组,dest指向0与非0的边界线


只要 nums[cur] 不是 0,就把这个元素归入左侧合法区间:
dest先往右挪一位(开辟出新的存放位置);- 将
nums[cur]赋值到nums[dest]; 遍历结束后,[0, dest]全是按原顺序保留的非 0 数,dest+1到数组末尾全部填 0。

当cur指向非0元素,dest++ 然后与 cur所指向的位置进行互换

过程:
示例:nums = [0,1,0,3,12],dest=-1,cur=0
cur=0,nums[0]=0:直接跳过,不处理cur=1,nums[1]=1≠0dest +=1 → dest=0nums[0] = 1此时有效区间:[0,0],内容[1]cur=2,nums[2]=0:跳过cur=3,nums[3]=3≠0dest +=1 → dest=1nums[1] = 3有效区间:[0,1],内容[1,3]cur=4,nums[4]=12≠0dest +=1 → dest=2nums[2] = 12有效区间:[0,2],内容[1,3,12]
一轮遍历完毕,dest=2; 对下标 3、4 全部赋值 0,最终数组:[1,3,12,0,0]。
四.编写代码
