给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例:
输入: [0,1,0,3,12]输出: [1,3,12,0,0]说明:必须在原数组上操作,不能拷贝额外的数组。尽量减少操作次数。
c语言
- 将非零前移
void moveZeroes(int* nums, int numsSize){int index = 0;for (int i = 0; i < numsSize; i++) {if (nums[i] != 0) {nums[index++] = nums[i];}}//数组补零for (int i = index; i < numsSize; i++) {nums[i] = 0;}}
c plus
- 循环一次
题解 用慢指针记录零的位置,然后和快指针交换对应的值即可。
class Solution {public:void moveZeroes(vector<int>& nums) {if (nums.size() == 0) return;int len = nums.size();int slow = 0; //寻找0的位置,找到后和非零的快指针交换。for (int i = 0; i < len; i++) {if (nums[i] != 0) {if (i > slow) { //相等时没必要交换。// 相当于[0,0]连着了,因为为0时,slow++,i++了,所以相等。nums[slow] = nums[i];nums[i] = 0;}slow++;//不为0时,继续向后找0的位置,找到后,不再移动}}}};
