【力扣】复写零,栈+双指针法

复写零原题地址

方法一:双指针法

从前向后复写,会造成覆盖。所以,应该从后向前复写,这样我们可以考虑维护一个栈。遍历数组,如果遇到非0元素,就入栈1次;如果遇到0,就入栈2次。当栈中的元素个数超出数组的元素个数时,把栈中的元素重新从后向前写入数组即可

如:对于数组[1 2 0 0 3 0 4],

1:入栈1次:[1]

2:入栈1次:[1 2]

0:入栈2次:[1 2 0 0]

0:入栈2次:[1 2 0 0 0 0]

3:入栈1次:[1 2 0 0 0 0 3]

此时栈中元素个数和数组元素个数相等,重新写入数组即可。

再举一个例子,对于数组[1 2 0 0 3 0 4 5]

1:入栈1次:[1]

2:入栈1次:[1 2]

0:入栈2次:[1 2 0 0]

0:入栈2次:[1 2 0 0 0 0]

3:入栈1次:[1 2 0 0 0 0 3]

0:入栈2次:[1 2 0 0 0 0 3 0 0]

此时栈中元素个数比数组元素个数多1个,需要去掉最后一个0,把[1 2 0 0 0 0 3 0]写入数组。

由于不允许开辟O(N)的额外空间,我们可以考虑用top来维护栈顶(即栈中的有效数据个数),模拟出入栈过程。假设数组长度为n,当top<n时,可以继续入栈

用下标i来记录要复写的元素,下标j来记录复写的目标位置。在前面模拟入栈的过程中,可以记录最后一个入栈的元素在数组中的下标,即i。由于是从后向前复写,j要初始化为n-1。

对于栈中元素个数比数组元素个数多一个,即top==n+1的特殊情况,最后一个0只需要复写1次,其余情况正常复写即可。复写时,把[0,i]的元素按照是否为0进行分类,非零元素复写1次,零复写2次。

// 方法一:双指针
class Solution {
public:
    void duplicateZeros(vector<int>& arr) {
        int n = arr.size();
        int top = 0; // 记录栈顶
        int i = -1;
        // 模拟把数组元素放入栈中
        while (top < n)
        {
            if (arr[++i])
            {
                ++top;
            }
            else
            {
                top += 2;
            }
        }

        // i表示要复写的数据
        // j表示要复写的位置
        int j = n - 1;
        // 最后放入2个0导致栈中元素比数组多
        if (top == n + 1)
        {
            arr[j--] = 0;
            --i;
        }

        // while(j>=0)也可以,但是第一个位置是否复写没有区别
        while (j > 0)
        {
            arr[j--] = arr[i];
            if (arr[i] == 0)
            {
                arr[j--] = 0;
            }

            --i;
        }
    }
};

相关推荐

  1. 复写+指针

    2024-02-08 00:38:02       34 阅读
  2. 每日OJ题_算法_指针②_1089. 复写

    2024-02-08 00:38:02       41 阅读
  3. 热题100_指针_283_移动

    2024-02-08 00:38:02       37 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-08 00:38:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-08 00:38:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-08 00:38:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-08 00:38:02       20 阅读

热门阅读

  1. LeetCodeLCR 114. 火星词典——拓扑排序

    2024-02-08 00:38:02       33 阅读
  2. Kylin系统下Qt的各种中文问题解决思路

    2024-02-08 00:38:02       34 阅读
  3. 1755. 最接近目标值的子序列和

    2024-02-08 00:38:02       34 阅读
  4. zstd字典压缩的大数据生产实践 & ctf逆向出题启发

    2024-02-08 00:38:02       29 阅读
  5. typedef 与#define 的概念及区别?

    2024-02-08 00:38:02       31 阅读
  6. 工具--Git详解

    2024-02-08 00:38:02       34 阅读
  7. MySQL数据库基础与SELECT语句使用梳理

    2024-02-08 00:38:02       26 阅读
  8. 查看 iOS 系统的日志或崩溃日志

    2024-02-08 00:38:02       33 阅读
  9. 如何使用 uniapp 开发(一)

    2024-02-08 00:38:02       37 阅读
  10. C++进阶--C++11包装器

    2024-02-08 00:38:02       28 阅读
  11. 【5G NR】移动通讯中使用的信道编解码技术

    2024-02-08 00:38:02       35 阅读
  12. Python 机器学习 特征预处理

    2024-02-08 00:38:02       32 阅读