力扣每日一题之移动零
题目说明:
给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
思路分析:我们可以考虑使用双指针来解答该题。双指针分为对撞指针和快慢指针。我们通过分析发现,快慢指针不适合该题,而对撞指针刚好满足。我们可以在数组头放置一个指针,在数组末尾放置一个指针:当尾指针指向的元素不是0则与头指针交换元素,交换完后尾指针前进一步,头指针后退一步;若是0,则直接跳过这个0,前进一步。就这样一直循环,直到两指针相撞,退出循环。
代码实现
void Swap(int* a, int* b)
{int tmp = *a;*a = *b;*b = tmp;
}void moveZeroes(int* nums, int numsSize) {int min = 0;int max = 0;while (max < numsSize){if (nums[max] != 0){Swap(&nums[max], &nums[min]);min++;}max++;}
}