https://leetcode.cn/problems/move-zeroes/description/?envType=study-plan-v2&envId=top-100-liked
将零元素移动到数组尾部,非零元素的相对位置不变。
这种找特殊数据,并且其他数据相对位置不变的问题,就可以用双指针实现。
类似我们写的快排的前后指针法一样,一个指针找小,找到小就和另一个指针位置的值交换,直到找小指针越界,这里是同样的思路。
由于我们最终要将非零的元素放在左边,所以我们就用一个指针去找非零元素,找到非零元素,我们就和另一个指针的位置值交换,然后另一个指针朝下走一步,走到下一个0元素的位置,一个指针继续找非零元素,直到越界。
如图,代码实现如下:
void Swap(int* a, int* b) {
int c = *a;
*a = *b;
*b = c;
}
void moveZeroes(int* nums, int numsSize) {
int Zero = 0;
int NoZero = 0;
// NoZero去找非零
while (NoZero < numsSize) {
if (nums[NoZero] != 0)
Swap(&nums[Zero++], &nums[NoZero]);
NoZero++;
}
}