- 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
思想:这个和之前的从排序数组中删除重复项很类似,虽然从题目上看“删除重复项”和“移动零”差别有点大,但是其中的忽略重复项和忽略重复零的思想是类似的,具体来说就是在一次遍历的过程中,遇到“0”就直接跳过,非0元素就插入nums[j] 后(这边用指针 j,记录数组中的非0元素个数)。最后将数组剩余元素都赋值为0。
// 时间复杂度O(n), 空间复杂度O(1)
void moveZeroes(int* nums, int numsSize) {
int temp = nums[0];
int j=0;
for(int i=0; i<numsSize; i++){
if(nums[i] != 0)
nums[j++] = nums[i];
}
for(int i=j; i<numsSize; i++)
nums[i] = 0;
}