【数组】283. 移动零-双指针
题目:

解答:
方法一:
当我们遇到一个非零元素时,我们需要交换当前指针和慢速指针指向的元素,然后前进两个指针。如果它是零元素,我们只前进当前指针。
1 class Solution { 2 public: 3 void moveZeroes(vector<int>& nums) 4 { 5 int slow = 0; 6 int fast = 0; 7 for (int fast = 0; fast < nums.size(); fast++) 8 { 9 if (nums[fast] != 0) 10 { 11 swap(nums[slow], nums[fast]); 12 slow++; 13 } 14 } 15 } 16 };
方法二:
解决方案:快慢指针,交换
分析题意:总之两句话,把0都移动到后面,非零的前后顺序还不能变。
解题思路: (1 )移动0就是交换后面非0的到前面。 (2 )顺序不能变,也就是交换的时候要跟数组中最前面的0交换。
应对策略: 两个指针,一快,一慢,快的始终指向下一个元素,判断是否可以交换到前面的(跟0交换)。 慢的始终指向此时此刻最前面的0的位置。
- 慢指针如何移动?发现不是0就移动。
- 快指针如何移动?每次直接移动一位,用来取下一个数。
- 快指针始终领先慢指针,始终指向下一个待判断是否需要移动的数。
1 class Solution { 2 public: 3 void moveZeroes(vector<int>& nums) 4 { 5 if(nums.size() == 0) 6 { 7 return; 8 } 9 10 int l = 0; 11 int r = 0; 12 while(r < nums.size()) 13 { 14 if(nums[l] !=0) 15 { 16 l++; 17 } 18 else 19 { 20 if(nums[r] != 0) 21 { 22 nums[l] = nums[l] ^ nums[r]; 23 nums[r] = nums[l] ^ nums[r]; 24 nums[l] = nums[l] ^ nums[r]; 25 l++; 26 } 27 } 28 r++; //始终后移一位,取下一个数。 29 } 30 31 } 32 };

浙公网安备 33010602011771号