首页 > 编程语言 >【C++习题】2.双指针_移动零

【C++习题】2.双指针_移动零

时间:2024-09-26 21:48:46浏览次数:9  
标签:cur nums ++ 元素 C++ dest 数组 习题 指针

文章目录


题目链接:

283.移动零


题目描述:

8ae324a8c2586aec8c1d8dd5879035e8


解法(快排的思想:数组划分区间 - 数组分两块):

双指针算法,利用数组下标充当指针。

我们可以用一个 cur 指针来扫描整个数组,另一个 dest 指针用来记录非零数序列的最后一个位置。根据 cur 在扫描的过程中,遇到的不同情况,分类处理,实现数组的划分。

cur 遍历期间,使 [0, dest] 的元素全部都是非零元素, [dest + 1, cur - 1] 的元素全是零。

127e769b240c2db89634662a2a181c02

遇到0元素:

cur++

遇到非0元素:

swap(dest+1, cur)

dest++, cur++


C++ 算法代码:

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

如果遇到0元素,cur++。也就是for(int cur = 0, dest = -1; cur < nums.size(); cur++)的末尾那句。

如果遇到非0元素,先swap(dest+1, cur)然后dest++, cur++。这里合并为 swap(nums[++dest], nums[cur]);


图解

  1. 开始:

d982048a769acad16bdca6c46649f308

  1. nums[cur]=0,不进入if条件,cur++

21842c468e1c458409b958b969586c08

  1. nums[cur]=1,进入if条件,交换++destcur位置的元素

9823e1d8ede2d6afa055aa794ace2869

  1. 然后cur++

4dcb2c872a675d23093405db3ec5ff33

  1. nums[cur]=0,不进入if条件,cur++

6d360d2972bbf066fb91bc68fad97457

  1. nums[cur]=3,进入if条件,交换++destcur位置的元素

4ae4908e4dd93655f2a980dcf389a133

  1. 然后cur++

8b807164ad280716ef2b916f1b8d374a

  1. nums[cur]=12,进入if条件,交换++destcur位置的元素

bbaa80e08655051b5389fac802a1f0bb

  1. 然后cur++

    不满足cur < nums.size();跳出循环

标签:cur,nums,++,元素,C++,dest,数组,习题,指针
From: https://blog.csdn.net/hlyd520/article/details/142516389

相关文章

  • 【Py/Java/C++三种语言OD独家2024E卷真题】20天拿下华为OD笔试之【哈希表】2024E-选修
    可上欧弟OJ系统练习华子OD、大厂真题绿色聊天软件戳oj1441了解算法冲刺训练(备注【CSDN】否则不通过)文章目录相关推荐阅读题目描述与示例题目描述输入输出示例一输入输出说明示例二输入输出说明解题思路代码pythonjavacpp时空复......
  • 【Py/Java/C++三种语言OD独家2024E卷真题】20天拿下华为OD笔试之【DFS/BFS】2024E-开
    可上欧弟OJ系统练习华子OD、大厂真题绿色聊天软件戳oj1441了解算法冲刺训练(备注【CSDN】否则不通过)文章目录相关推荐阅读题目描述与示例题目描述输入输出示例一输入输出说明示例二输入输出解题思路代码解法一:BFSpythonjavacpp......
  • C++ day07
    C++笔试题合集:1、什么是虚函数?什么是纯虚函数?    1>在类中定义函数时,在函数名前加上virtual关键字,该函数就是虚函数,虚函数可以保证在父子类中只有一个该函数。    2>当虚函数头=0;时该函数就是纯虚函数,当类中的某些成员函数没有实现的意义,仅仅时该类中拥有......
  • 【C++】你对vector的了解又有多少呢?
    【C++】你对vector的了解又有多少呢?一.vector的介绍二.vector的使用1.vector的构造代码举例:2.vector空间增长问题resize机制:reserve扩容机制:3.vector增删查改代码举例一:代码举例二:一.vector的介绍vector是表示可变大小数组的序列容器。就像数组一样,vect......
  • C++ 原始字符串(raw string literal )R“(...)“
    C++11可以在代码里嵌入一段原始字符串,该原始字符串不作任何转义,所见即所得。这个特性对于编写代码时要输入多行字符串,或者含带有特殊字符的字符串提供了巨大方便。语法:     R"(...)"记忆点:1.不做任何转义 stringstr="aaa\nbbb\nccc\n"; cout<<str<<endl......
  • c++笔记
    类和对象类用于指定对象的形式,是一种用户自定义的数据类型,它是一种封装了数据和函数的组合。类中的数据称为成员变量,函数称为成员函数。类可以被看作是一种模板,可以用来创建具有相同属性和行为的多个对象。一、定义类类的定义需要使用关键字class,然后指定类的名称,类的......
  • C++—单例设计模式
    单例设计模式C++中的单例设计模式是一种常用的软件设计模式,其核心目的是确保一个类仅有一个实例,并提供一个全局访问点来获取这个实例。以下是对C++单例设计模式的详细解释:一、单例设计模式的定义单例模式(SingletonPattern)是一种创建型设计模式,它确保一个类只有一个实例,......
  • C++学习,信号处理
    C++信号处理,依赖于操作系统提供的API。信号处理主要用于响应外部事件,如中断信号(如SIGINT,SIGTERM等),这些信号可以由操作系统、其他程序或用户生成。在Unix-like系统(如Linux和macOS)中,信号处理可以通过signal函数或更灵活的sigaction函数来设置。在C++程序中直接使用这些函数是......
  • C++学习,# 和 ## 运算符
    C++中,# 和 ## 是两个特殊的预处理运算符,它们主要在宏定义中使用,用于字符串化和标记粘贴(tokenpasting)操作。 # 运算符:字符串化# 运算符用于将其后的宏参数转换为一个字符串常量。如果宏参数是一个宏标识符,则它会被转换成用双引号括起来的该标识符的字符串表示。这个操......
  • Effective C++学习
    导读声明式externintx;std::size_tnumDigits(intnum);classPerson;template<typenameT>classGraphNode;签名式std::size_t(int);//这个函数获得一个int,返回一个size_t定义式intx;std::size_tnumDigits(intnum){std::size_tdigitSoFar=......