给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入: nums = [0,1,0,3,12]
输出:[1,3,12,0,0]
示例 2:
输入: nums =
[0]
输出:
[0]
提示:
1 <= nums.length <= 104
-231 <= nums[i] <= 231 - 1
法一: 直接法
有两种写法。一种是申请一块新的内从空间。一种是直接在原有的数组中进行修改。
写法一:
void moveZeroes(int* nums, int numsSize){ int j=0; int i=0; for(i=0;i<numsSize;i++) { if(nums[i]!=0) { nums[j++]=nums[i]; } } while(j<numsSize) { nums[j++]=0; } }
写法二:
void moveZeroes(int* nums, int numsSize){ int i=0; int j=0; int arr[numsSize]; for(i=0;i<numsSize;i++) { if(nums[i]!=0) { arr[j]=nums[i]; j++; } } for(j=j;j<numsSize;j++) { arr[j]=0; } for(i=0;i<numsSize;i++) { nums[i]=arr[i]; } }
法二:
将本数组遍历一遍,并且判断第i个位置与第i+1个位置的值是否位第i个位置的值为0,第i+1个的位置的值大于0;如果是那就两两交换。
写法一:
void moveZeroes(int* nums, int numsSize){ int i=0; int j=0; for(j=0;j<numsSize;j++) { for(i=0;i+1<numsSize;i++) { if(nums[i]==0&&nums[i+1]!=0) { int t=nums[i]; nums[i]=nums[i+1]; nums[i+1]=t; } } } }
写法二:
void moveZeroes(int* nums, int numsSize){ bool isok=true; while(true) { for(int i=0;i<numsSize;i++) { if(nums[i]==0&&nums[i+1]!=0) { isok=false; nums[i]=nums[i+1]; nums[i]=0; } } if(isok) { break; } } }