力扣283题:移动零
题目描述
给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
输入输出样例
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
输入: nums = [0]
输出: [0]
解法一,双指针第一版
class Solution {
public:void moveZeroes(vector<int>&nums){//当数组为空,或者长度为1的时候返回原数组即可if(nums.empty()||nums.size()==1){return;}//建立双指针int left=0;int right=1;int length=nums.size();while(right<length){//当左边为零,查找右边第一个不为0的值并进行交换while(nums[left]==0&&right<length){if(nums[right]!=0){int temp=nums[right];nums[right]=nums[left];nums[left]=temp;}else {right++;}}left++;right++;}}
};
解法二,双指针简化版
void moveZeroes2(vector<int>&nums){int length=nums.size();int left=0,right=0;while(right<length){//left 指向已经处理好数据的尾部//right 指向将要处理的头部//一开始是跟本身进行交换,但不影响结果if(nums[right]){int temp=nums[right];nums[right]=nums[left];nums[left]=temp;left++;}right++;}}