双指针

1.移动零

题目链接:. - 力扣(LeetCode)

代码:

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        for(int cur=0, dest = 0; cur<nums.size(); cur++)
        {
            cout<<"int"<<endl;
            if(nums[cur])

                swap(nums[dest++], nums[cur]);
        }
    }
};

保证left指向第一个零, right指向left后的第一个非零。此时交换nums[left], nums[right]可以保证顺序不变且零元素都在后面 

 2.复写零

题目链接:. - 力扣(LeetCode)

代码:

class Solution {
public:
    void duplicateZeros(vector<int>& arr) {
        //正向复写会导致复写速度快于读取速度, 采取反向便利
        int n = arr.size();
        int left = 0, right = -1;
        //求出最后边界字母
        while(right<n-1)
        {// 维持:当到下标为left时, 对应复写后下标为right
            if(arr[left] == 0) right+=2;
            else right++;
            cout<<"left:"<<left<<"right:"<<right<<endl;

            left++;
        }
        left--;//抵消最后一次left++
        int border = left;
        cout<<left<<" "<<right<<endl;

        if(right == n)// 溢出
        {//arr[border]为0  造成溢出
            cout<<"溢出"<<left<<" "<<right<<endl;
            arr[n-1] = 0;
            right-=2;
            left--;
        }
        while(left>=0)
        {
            cout<<left<<" "<<right<<endl;
            if(arr[left] == 0)
            {
                arr[right--] =0;
                arr[right--] =0;
            }
            else
            {
                arr[right--] = arr[left];
            }
            left--;
        }
    }
};

找到合适border:明确left, right意义即可

解决溢出问题:见代码

 注意事项&代码解析见上注释

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值