LeetCode - 283. 移动零
题目
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++;}}
};