题目描述
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例
示例1:
~~~~
输入: nums = [0,1,0,3,12]
~~~~
输出: [1,3,12,0,0]
示例2:
~~~~
输入: nums = [0]
~~~~
输出:[0]
提示:
- 1 <= nums.length <= 104
- -231 <= nums[i] <= 231 - 1
分析:
将数组所有的0移动的数组的末尾,并且不改变非零元素的相对顺序只需要按照从前往后的顺序将所有不为0的数跟前面为0的数交换位置即可。如下图:
代码实现如下:
class Solution{
public:
void moveZeros(vector<int>& nums){
int i=0,j=1;
while(j<nums.size()&&i<nums.size()){
//寻找第一个0
while(nums[i]!=0){
i++;
if(i==nums.size()) break;//如果数组没有0了,退出
}
if(j>i&&nums[j]!=0){//如果非零数前面有0,交换两个数的位置
nums[i]=nums[j];
nums[j]=0;
}
j++;
}
}
};