根据题目要求,我们需要将数组中的0全部移动到数组的末尾,同时又要保证非零元素原有的顺序,并且直接在数组上进行交换的操作。
那么,最简单的想法就是,每搜索到一个0,就提出来放到数组最后,其他元素整体前移一位。但因为不让使用额外数组存储,依次移动的话需要额外花费的操作和时间太多了。所以我们使用双指针的方式来实现。
代码实现设定i和j两个指针,i用于搜索非零元素,j用于搜索0元素。两个指针分别用两个for循环从左向右搜索,当搜索到“当前未处理的第一个”非0元素、0元素,跳出循环,此时所记录的i、j的位置就是第一个非0元素、0元素的位置。若记录下来的i大于j,说明该0元素在未处理部分第一个非0元素之前,则将i位置非零元素赋值给j位置,使i位置元素为0。
此时i位置为0,j位置为非0。那么进入下一个循环,i、j会继续向后搜索未处理过的数组部分的第一个非0和0元素。以此类推,直至i或者j超出数组长度,则说明全部数组都处理完成了。
class Solution {
public:
void moveZeroes(vector& nums) {
int i = 0, j = 0;
int t = 0;
while(i < nums.size()){
for(i; i < nums.size(); i++){
if(nums[i] != 0) break;
}
if(i >= nums.size()) return;
for(j; j < nums.size(); j++){
if(nums[j] == 0) break;
}
if(j >= nums.size()) return;
if(i > j){
nums[j] = nums[i];
nums[i] = 0;
}
i++;
}
}
};



