双指针法
c 语言实现
void moveZeroes(int* nums, int numsSize) {int dest,cur; //创建临时指针和目标指针dest=cur=0;//出初始化while(cur<numsSize)//遍历{if(nums[cur]!=0){swap(&nums[cur],&nums[dest]);cur++;dest++;}else{cur++;}}}
思路是建立两个指针,开始遍历,cur指针指向数据不为0就交换并且让cur++,dest++,为0就让cur++
0 1 0 3 12 为0只让cur++
dest
cur
1 0 0 3 12 不为0交换二者,让cur++,dest++
dest
cur
1 0 0 3 12 为0让cur++
dest
cur
1 3 0 0 12 不为0就交换再让cur++,dest++
dest
cur
1 3 0 0 12 为0让cur++
dest
cur
1 3 12 0 0 不为0就交换再让二者++
dest
cur
cur=numsSize跳出循环
c++实现
思路相同初始值略有不同,更加简洁
class Solution {
public:void moveZeroes(vector<int>& nums) {for(int dest=-1,cur=0;cur<nums.size();cur++)if(nums[cur])swap(nums[++dest],nums[cur]);}
};
其实这里还可以用快排来实现