一、介绍
1.题目描述
题目链接:https://leetcode-cn.com/problems/move-zeroes/
给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
说明:
- 必须在原数组上操作,不能拷贝额外的数组。
- 尽量减少操作次数。
2.测试样例
[0,1,0,3,12] # [1,3,12,0,0]
[0,0,1] # [1,0,0]
[0] # [0]
[0,0] # [0,0]
二、题解
1、暴力🟢
1、从数组第一个下标开始,看是否为0,如果不为0指针后移。
2、移到为0的下标后,通过交换相邻元素将0移动到最后
- 用temp记录当前数组中第一个0元素的下标,下次遍历从此处开始
- 移动完一个0后,将长度-1,减少重复交换。
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int n=nums.size(),temp=0,i;
if(n<=1) return;
while(i<n-1){
i=temp;
while(nums[i]!=0&&i<n-1)i++;
temp=i;
if(nums[i]==0){
for(int j=i+1;j<n;j++){
swap(nums[j],nums[j-1]);
}
n--;
}
}
}
};
2、双指针🟡
1、定义指针 l 和 r
2、r 后移,当 r 找到一个不为0的数,和 l 所指的位置交换,l 后移
3、当 r 移动到末尾,结束
这样既可以保证元素按序,又可以保证 0 会在末尾
参考链接:https://leetcode-cn.com/problems/move-zeroes/solution/yi-dong-ling-by-leetcode-solution/
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int n=nums.size(),l=0,r=0;
while(r<n){
if(nums[r]!=0){
swap(nums[l],nums[r]);
l++;
}
r++;
}
}
};