双指针_移动零和_复写零_c++

283. 移动零 - 力扣(LeetCode)

算法原理:

两个指针的作用:

cur : 从左往右扫描数组,遍历数组

dest :已处理的区间内,非零元素的最后一个位置

三个区间:

[0,dest] [dest +1 , cur-1] [cur, n-1]

| | |

非零 零 待处理

当cur为零的时候 ++cur

当cur非零的时候,cur与交换dest+1的位置进行交换

代码实现:

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

1089. 复写零 - 力扣(LeetCode)

算法原理:

  1. 先找到最后一个"复写"的数

双指针算法

a,先判断cur位置的值

b,根据cur决定dest向后移动一步或者两步

c,判断一下dest是否已经到结束了

d,cur++

2.处理下边界情况

用上面的操作,这个dest的会越界

本意是将n-1的位置和n的位置置为0,但是n的位置已经越界所以只能n-1的位置为零 然后再让dest向前移动两步,cur向前移动一步即可

3.从后往前完成复写操作

代码实现

class Solution {
public:
    void duplicateZeros(vector<int>& arr) {
        int cur = 0,dest = -1,n=arr.size();
        //先找到复写的最后一个数
        while(cur<n)
        {
            if(arr[cur])
                dest++;
            else
                dest+=2;
            if(dest>=n-1)
                break;
            cur++;
        }
        //处理边界情况
        if(dest==n)
        {
            arr[n-1]=0;
            cur--;dest-=2;
        }
        while(cur>=0)
        {
            if(arr[cur])
            {
                arr[dest--]=arr[cur--];
            }
            else
            {
                arr[dest--]=0;
                arr[dest--]=0;
                cur--;
            }
        }
    }
};
相关推荐
轻口味41 分钟前
命名空间与模块化概述
开发语言·前端·javascript
晓纪同学2 小时前
QT-简单视觉框架代码
开发语言·qt
威桑2 小时前
Qt SizePolicy详解:minimum 与 minimumExpanding 的区别
开发语言·qt·扩张策略
飞飞-躺着更舒服2 小时前
【QT】实现电子飞行显示器(简易版)
开发语言·qt
明月看潮生2 小时前
青少年编程与数学 02-004 Go语言Web编程 16课题、并发编程
开发语言·青少年编程·并发编程·编程与数学·goweb
明月看潮生2 小时前
青少年编程与数学 02-004 Go语言Web编程 17课题、静态文件
开发语言·青少年编程·编程与数学·goweb
Java Fans2 小时前
C# 中串口读取问题及解决方案
开发语言·c#
盛派网络小助手2 小时前
微信 SDK 更新 Sample,NCF 文档和模板更新,更多更新日志,欢迎解锁
开发语言·人工智能·后端·架构·c#
Chinese Red Guest3 小时前
python
开发语言·python·pygame
一棵星3 小时前
Java模拟Mqtt客户端连接Mqtt Broker
java·开发语言