题目链接
题目描述:
思路:
双指针,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]<<" ";
}
}