題目
283. 移動零 - 力扣(LeetCode)
思路
我們使用左右兩個指針:左指針left指向已處理好的非零元素的末尾位置,右指針right用于遍歷數組。
算法步驟:
- 初始化left為-1(表示還沒有處理任何非零元素)
- 右指針right從0開始遍歷整個數組
- 當right遇到非零元素時,將left指針前進一步,然后交換left和right指向的元素
- 這樣就能保證left指針左側的所有元素都是非零的,且保持原有順序
讀者可能出現的錯誤寫法
class Solution {
public:void moveZeroes(vector<int>& nums) {int left = -1;int right = 0;while(right < nums.size()){if(nums[right] != 0){swap(nums[left],nums[right]);left++;}right++;}}
};
為什么是先left++,然后再進行swap的,因為這里初始化left是-1,如何先交換的話就會報錯
正確寫法
class Solution {
public:void moveZeroes(vector<int>& nums) {int left = -1;int right = 0;while(right < nums.size()){if(nums[right] != 0){swap(nums[++left],nums[right]);}right++;}}
};