给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
【示例】
输入: [0,1,0,3,12] 输出: [1,3,12,0,0]
【说明】
必须在原数组上操作,不能拷贝额外的数组。 尽量减少操作次数。
双指针法,左指针依次遍历数组,当遇到0时,右指针从当前位置向后搜索,直到找到第一个不为0的值或到末尾,如果不在末尾,则交换左右指针的值,左指针继续遍历。
class Solution { public: void moveZeroes(vector<int>& nums) { for (int i=0,j=0; i< nums.size();++i){ if (nums[i]==0){ for (j=i+1; j<nums.size() && nums[j]==0; ++j); if (j < nums.size()) swap(nums[i], nums[j]); } } } };快指针依次遍历数组,快指针指向的值等于0时,慢指针停下,当快指针不等于0时交换慢指针和快指针的值,同时慢指针递增1。
class Solution { public: void moveZeroes(vector<int>& nums) { for (int f=0, s=0; f<nums.size(); ++f){ if (nums[f]!=0){ swap(nums[f],nums[s]); ++s; } } } };