LeetCode283.移动零

0 阅读1分钟

题目链接

🔗:283. 移动零 - 力扣(LeetCode)

题目描述

image.png

思路:

双指针,i、j初始共同指向第一个位置。遍历数组,若i,j处于相同位置且当前元素不为0,则各自自增1;若i,j处于相同位置且当前元素为0,则j自增1,i则等待j遍历到非0元素时与i位置元素进行交换;若i,j处于不同位置,那此时i必然是因为被0拖住,判断j位置元素是否非零,如果非零,与i位置元素进行交换,然后i,j自增(i自增后的那个位置必然还是0,继续等待j遍历到非零元素与其交换,实现非零元素的前置);若j位置元素为0,则i不动,j继续后移。

题解

——leetcode模式

public:
    void moveZeroes(vector<int>& nums) {
        int t=nums.size();
        for(int i=0,j=0;i<t&&j<t;){
            if(i==j){
                if(nums[i]!=0){i++; j++;}
                else{j++;}
            }
            else{
                if(nums[j]!=0){swap(nums[i++],nums[j++]);}
                else{j++;}
            }
        }
    }
};

——acm模式

#include<vector>
#include<algorithm>
using namespace std;
void moveZeroes(vector<int>& nums) {
    int t=nums.size();
    for(int i=0,j=0;i<t&&j<t;){
		if(i==j){
			if(nums[i]!=0){i++; j++;}
			else{j++;}
		}
		else{
			if(nums[j]!=0){swap(nums[i++],nums[j++]);}
			else{j++;}
		}
	}
}
int main(){
	vector<int>v;
	int n,a; cin>>n;
	for(int i=0;i<n;i++){
		cin>>a; v.push_back(a);
	}
	moveZeroes(v);
	for(int i=0; i<n; i++){
		cout<<v[i]<<" ";
	}
}