LeetCode1089.复写零

14 阅读1分钟

题目链接:

🔗1089. 复写零 - 力扣(LeetCode)

题目描述:

image.png

思路:

双指针,不要从前往后复制,因为会覆盖遍历过的元素。首先遍历容器,找到截断位置,然后从截断位置从后往前复制,非零数复制一次,零复制两次,但要注意如果统计得到的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]<<" ";}
}