给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入: nums =[0,1,0,3,12]
输出:[1,3,12,0,0]
示例 2:
输入: nums =[0]
输出:[0]
提示:
1 <= nums.length <= 10^4
-2^31 <= nums[i] <= 2^31 - 1
进阶:你能尽量减少完成的操作次数吗?
题目解释
题目要求:将所有的'0'元素移到右边,所有的非'0'元素移到左边,但不能改变非'0'元素的相对顺序
也就是说 [1,2,0,3]->[3,2,1,0](FALSE)
必须 [1,2,0,3]->[1,2,3,0](TRUE)
算法思想
数组划分,数组分块
(这里的size是nums的元素个数)
dest->非'0'元素区间的最后一个元素
cur->待处理元素区间的首个元素
在一开始,待处理元素下标为0,cur=0
但是非'0'元素区间不存在,令dest=-1
然后让cur遍历数组
若nums[cur]==0 则cur++
若nums[cur]!=0 则dest++ swap(nums[dest],nums[cur]) cur++
当cur==size时,停止循环
代码实现
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int dest=-1,cur=0;
while(cur<nums.size())
{
if(nums[cur]!=0)
{
swap(nums[++dest],nums[cur]);
}
cur++;
}
}
};