给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
输出: [1,3,12,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
尽量减少操作次数。
思路:
暴力法:直接运用vector容器的swap函数,从后往前,发现一个0就再来一个循环一直交换到最后
1 void moveZeroes(vector<int>& nums) 2 { 3 int len = nums.size(); 4
3 for(int i = nums.size()-1; i >= 0; i--) 6 { 7 if(nums[i] == 0) 8 { 9 for(int j = i; j < nums.size()-1; j++) 10 { 11 swap(nums[j], nums[j+1]); 12 } 13 } 14 } 15 }
双指针: 指针j 始终指向第一个不为0的数组元素, 指针i 一直往前索引,然后交换,一次遍历即可,很快。
1 void moveZeroes(vector<int>& nums) 2 { 3 int i,j; 4 for(i=0,j=0;i<nums.size();i++) 5 { 6 if(nums[i]!=0) 7 { 8 swap(nums[i],nums[j]); 9 j++; 10 } 11 } 12 }