题目链接:
题目描述:
思路:
双指针,不要从前往后复制,因为会覆盖遍历过的元素。首先遍历容器,找到截断位置,然后从截断位置从后往前复制,非零数复制一次,零复制两次,但要注意如果统计得到的c大于容器长度,那必然是截的最后一个元素是一个0,加了两次,因此对这个0复制时只需要复制一次即可。
题解:
——leetcode模式:
class Solution {
public:
void duplicateZeros(vector<int>& arr) {
int t=arr.size(),c=0,i=0;
for(; i<t&&c<t; i++){
if(arr[i]!=0) c++;
else c+=2;
}
if(i==t) return; //没0,不用动
for(int j=i-1,k=t-1;j>=0&&k>=0;--j){
arr[k--]=arr[j];
if(arr[j]!=0||(c>t&&k==t-2)) continue;
else arr[k--]=0;
}
}
};
——acm模式:
#include<iostream>
#include<vector>
using namespace std;
void duplicateZeros(vector<int>& arr) {
int t=arr.size(),c=0,i=0,end=1;
for(; i<t&&c<t; i++){
if(arr[i]!=0) c++;
else c+=2;
}
if(i==t) return; //没0,不用动
for(int j=i-1,k=t-1;j>=0&&k>=0;--j){
arr[k--]=arr[j];
if(arr[j]!=0||(c>t&&k==t-2)) continue; //如果c>t,必然是截断位置的末尾是0,这个0只需要复制出一个0就可以
else arr[k--]=0;
}
}
int main(){
int n,a; vector<int>v;
cin>>n;
for(int i=0;i<n; i++){
cin>>a; v.push_back(a);
}
duplicateZeros(v);
for(int i=0;i<n;i++){cout<<v[i]<<" ";}
}