283. 移动零 - 力扣(LeetCode)

非常基础的快慢指针题

快指针不断前移,快指针处不等于0时将0传递给慢指针

慢指针只有当接收到快指针传来的值后才前移

代码

写法1:快指针一次移动多次

void moveZeroes(vector<int>& nums) {
	int left = 0;
	
	for (int right = 0; right < nums.size(); ++right) {
		// right直接移动到下一个非0元素(也可以一个个元素地移动)
		while (right < nums.size() && nums[right] == 0)
			++right;
		if(right < nums.size())
			nums[left++] = nums[right];
	}
	for (; left < nums.size(); ++left)
		nums[left] = 0;
}

写法2:慢指针一次只移动一次,更简洁一些

void moveZeroes(vector<int>& nums) {
	int slow = 0;
	for (int fast = 0; fast < nums.size(); ++fast) {
		if (nums[fast] != 0)
			nums[slow++] = nums[fast];
	}
	while (slow < nums.size())
		nums[slow++] = 0;
}