移动零,leetCode热题100,C++实现
题目来源:leetCode
283. 移动零 - 力扣(LeetCode)
解法
class Solution {
public:void moveZeroes(vector<int>& nums) {int n = nums.size(), left = 0, right = 0;while (right < n) {if (nums[right]) {swap(nums[left], nums[right]);left++;}right++;}}
};
双指针法,right遍历数组,遇到非0则与left进行交换
举例 [ 0,1,2,0,3],起始都指向第一个0,right后移,指向下标1,此时交换0和1,数组变成[1,0,2,0,3]
然后left++,left指向下标1,right++,指向下标2,再次交换,数组变成[1,2,0,0,3]
然后left++,left指向下标2,right++,指向3,此时是0,right++,指向下标4,也就是指向3,交换后变成[1,2,3,0,0]
另一种情况[1,2,3,0,0,4],起始时,right指向1,为非0,则交换,也就是1和1交换,不变,然后left++,right++,都指向2,再次交换,以此类推,这种情况会自己和自己交换,所以不影响