给定一个数组 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的位置,找到后,不再移动
}
}
}
};