1.题目描述
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
2.解题思路
思路1:暴力解,循环过程中记录0的个数,遇到非0就往前移动0个数个位置(新手友好型),最后再填补0到末尾
思路2:双指针遍历+交换
3.代码
1)暴力法
cpp
void moveZeroes(int* nums, int numsSize) {
int cnt = 0;//记录0的个数
for(int i = 0; i < numsSize; i++){
if(nums[i]==0){
cnt++;//碰到0就+1
}else{//否则就移动非零元素
nums[i-cnt] = nums[i];
}
}
for(int j = 0; j< cnt;j++){
nums[numsSize -1- j] = 0;//填补0
}
}
2)双指针法
cpp
void swap(int *a, int *b) {
int t = *a;
*a = *b, *b = t;
}
void moveZeroes(int *nums, int numsSize) {
int left = 0, right = 0;
while (right < numsSize) {
if (nums[right]) {
swap(nums + left, nums + right);
left++;
}
right++;
}
}