首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >2.《双指针篇》---②复写零(标的简单,实际比较复杂)

2.《双指针篇》---②复写零(标的简单,实际比较复杂)

作者头像
用户11288958
发布2024-11-21 15:04:51
发布2024-11-21 15:04:51
920
举报
文章被收录于专栏:学习学习

题目传送门

方法一:双指针

我们发现不能从前向后复写,因为会覆盖掉还没有被复写的数据 因此我们需要从后往前复写。 此时left应该指向最后一个被复写的数。 right指向数组最后一个元素 1.找到最后一个被复写的数据。我们用left指向 ①先判断left的位置0/非0 ②再决定right往后走一步还是两步 ③判断一下right是否走到最后 ④left++ 1.5 处理一下边界条件。 因为第一步完成后.right可能越界 我们手动完成最后一步的复写 2.从后向前。完成复写操作。 ①判断arr【left】是否为0.

代码语言:javascript
复制
class Solution {
    public void duplicateZeros(int[] arr) {
        //我们发现不能从前向后复写,因为会覆盖掉还没有被复写的数据
        //因此我们需要从后往前复写。
        //此时left应该指向最后一个被复写的数。
        //right指向数组最后一个元素

        //1.找到最后一个被复写的数据。
//注意right初始化为-1.因为刚开始我们不知道最后一个位置在哪。因此先为-1
//因为只有数组有值,才会被复写。因此先判断arr[left]为0还是非0.
        int left = 0,right = -1;
        int n = arr.length;

        while(left < n){
            if(arr[left] == 0){
                right += 2;
            }else{ 
                right++;
            }
            if(right >= n-1){
                break;
            }
            left++;
        }
//1.5.处理一下边界条件。因为第一步完成后.right可能越界
//我们手动完成最后一步的复写
        if(right == n){
            arr[n-1] = 0;
            right -= 2;
            left--;
        }
//2.从后往前。完成复写
        while(left >= 0){
            if(arr[left] == 0){
                arr[right--] = 0;
                arr[right--] = 0;
                left--;
            }else{
                arr[right--] = arr[left--];
            }
        }
    }
}

复杂度分析

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-11-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目传送门
  • 方法一:双指针
  • 复杂度分析
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档