双指针_移动零和_复写零_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--;
            }
        }
    }
};
相关推荐
倒头就睡的小比特5 天前
算法竞赛C++常用的STL
c++·算法
weilx12345 天前
C++笔记-文件IO-<fcntl.h>
c++
小羊没烦恼!5 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
伞伞悦读5 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
Smileyqp沛沛5 天前
前端?C++ ?较大差异基础罗列
c++·基础·前端转c++
C语言小火车5 天前
C/C++ 为什么需要编译器?
开发语言·c++
旖旎夜光5 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
吞下星星的少年·-·5 天前
C++ 萌新语法入门篇
c++·算法比赛
霍霍的袁5 天前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio
another heaven5 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法