双指针_移动零和_复写零_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--;
            }
        }
    }
};
相关推荐
曼巴UE52 分钟前
UE C++ 字符串的操作
java·开发语言·c++
天天进步20157 分钟前
Linux 实战:如何像查看文件一样“实时监控” System V 共享内存?
开发语言·c++·算法
凛_Lin~~10 分钟前
安卓/Java语言基础八股文
java·开发语言·安卓
八年。。12 分钟前
Python 版本确认方法
开发语言·笔记·python
foundbug99914 分钟前
基于MATLAB Simulink的双向DC-DC变换器仿真程序实现
开发语言·matlab
元亓亓亓24 分钟前
考研408--操作系统--day8--操作系统--虚拟内存&请求分页&页面置换/分配
android·java·开发语言·虚拟内存
liulilittle26 分钟前
C++ OS相关。
c++
仰泳的熊猫35 分钟前
1176 The Closest Fibonacci Number
数据结构·c++·算法·pat考试
裤裤兔42 分钟前
Python打印输出换行
开发语言·python
一水鉴天44 分钟前
整体设计 定稿 之24+ dashboard.html 增加三层次动态记录体系仪表盘 之2 程序 (Q208 之2)
开发语言·前端·javascript