双指针 | 移动零 | 复写零

2024-03-17 19:04
文章标签 复写 指针 移动

本文主要是介绍双指针 | 移动零 | 复写零,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.移动零

题目描述:

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

示例:

输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]

解题思路:

  1. right指针一直往后移动,当nums[right]非0时和left指向的元素交换,然后left往后移动。
    在这里插入图片描述

  2. 如果nums只有一个元素如[1],那么直接交换没有影响,两外left变为1,没有访问数组是不会越界的。

class Solution {
public:void moveZeroes(vector<int>& nums) {for(int left = 0,right = 0; right < nums.size();right++){if(nums[right] != 0){swap(nums[left],nums[right]);left++;}    }}
};
2.复写零

题目描述:

给你一个长度固定的整数数组 arr ,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。

注意:请不要在超过该数组长度的位置写入元素。请对输入的数组 就地 进行上述修改,不要从函数返回任何东西。

示例:

输入:arr = [1,0,2,3,0,4,5,0]
输出:[1,0,0,2,3,0,0,4]

解题思路:

方法一:O(N^2)

  1. 使用index指针遍历,当index下标指向的元素是0将该位置往后的元素整体往后移动。腾出的那个位置填上0即可。
    在这里插入图片描述
  2. 注意判断index刚好为最后一个且为0的特殊情况
class Solution {
public:void duplicateZeros(vector<int>& arr) {for(int index = 0;index < arr.size();index++){if(arr[index] == 0){for(int tmp = arr.size() -1;tmp > index;tmp--){arr[tmp] = arr[tmp-1];}if(index + 1 < arr.size()){arr[index+1] = 0;index++;}}}}
};

方法二:(O(N))

  1. 方法一,当找到index下标指向的元素为0,然后从前往后移动元素,浪费时间。能不能从后往前移动?[快慢双指针]

  2. 当left下标的元素非0时right++,为0则right+=2。最终right指向最后一个位置,right和left恰好腾出来两个位置,为两个0插入增加空间。(这起始位置很巧妙)
    在这里插入图片描述

  3. 特殊情况,left指向的位置由于空间不足,无法添加一个0,而且right也越界了。arr[arr.size() -1] = 0,right -=2,left–。

    在这里插入图片描述

  4. 从后往前移动,当arr[left]非0,移动即可,arr[left]为了添加一个0

class Solution {
public:void duplicateZeros(vector<int>& arr) {int left = 0,right = -1;while(left < arr.size()){if(arr[left] != 0)right++;else right +=2;if(right >= arr.size() - 1)break;left++;}if(right == arr.size()){arr[arr.size() -1] = 0;left--;right-=2;}while(left >= 0){if(arr[left] != 0){arr[right] = arr[left];right--;}else{arr[right--] = 0;arr[right--] = 0;}left--;}}
};

这篇关于双指针 | 移动零 | 复写零的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/819857

相关文章

Java空指针异常NullPointerException的原因与解决方案

《Java空指针异常NullPointerException的原因与解决方案》在Java开发中,NullPointerException(空指针异常)是最常见的运行时异常之一,通常发生在程序尝试访问或... 目录一、空指针异常产生的原因1. 变量未初始化2. 对象引用被显式置为null3. 方法返回null

双系统电脑中把Ubuntu装进外接移动固态硬盘的全过程

《双系统电脑中把Ubuntu装进外接移动固态硬盘的全过程》:本文主要介绍如何在Windows11系统中使用VMware17创建虚拟机,并在虚拟机中安装Ubuntu22.04桌面版或Ubunt... 目录一、首先win11中安装vmware17二、磁盘分区三、保存四、使用虚拟机进行系统安装五、遇见的错误和解决

使用FileChannel实现文件的复制和移动方式

《使用FileChannel实现文件的复制和移动方式》:本文主要介绍使用FileChannel实现文件的复制和移动方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录使用 FileChannel 实现文件复制代码解释使用 FileChannel 实现文件移动代码解释

go 指针接收者和值接收者的区别小结

《go指针接收者和值接收者的区别小结》在Go语言中,值接收者和指针接收者是方法定义中的两种接收者类型,本文主要介绍了go指针接收者和值接收者的区别小结,文中通过示例代码介绍的非常详细,需要的朋友们下... 目录go 指针接收者和值接收者的区别易错点辨析go 指针接收者和值接收者的区别指针接收者和值接收者的

Java Optional避免空指针异常的实现

《JavaOptional避免空指针异常的实现》空指针异常一直是困扰开发者的常见问题之一,本文主要介绍了JavaOptional避免空指针异常的实现,帮助开发者编写更健壮、可读性更高的代码,减少因... 目录一、Optional 概述二、Optional 的创建三、Optional 的常用方法四、Optio

Qt把文件夹从A移动到B的实现示例

《Qt把文件夹从A移动到B的实现示例》本文主要介绍了Qt把文件夹从A移动到B的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录如何移动一个文件? 如何移动文件夹(包含里面的全部内容):如何删除文件夹:QT 文件复制,移动(

解决java.lang.NullPointerException问题(空指针异常)

《解决java.lang.NullPointerException问题(空指针异常)》本文详细介绍了Java中的NullPointerException异常及其常见原因,包括对象引用为null、数组元... 目录Java.lang.NullPointerException(空指针异常)NullPointer

Python重命名文件并移动到对应文件夹

《Python重命名文件并移动到对应文件夹》在日常的文件管理和处理过程中,我们可能会遇到需要将文件整理到不同文件夹中的需求,下面我们就来看看如何使用Python实现重命名文件并移动到对应文件夹吧... 目录检查并删除空文件夹1. 基本需求2. 实现代码解析3. 代码解释4. 代码执行结果5. 总结方法补充在

我在移动打工的日志

客户:给我搞一下录音 我:不会。不在服务范围。 客户:是不想吧 我:笑嘻嘻(气笑) 客户:小姑娘明明会,却欺负老人 我:笑嘻嘻 客户:那我交话费 我:手机号 客户:给我搞录音 我:不会。不懂。没搞过。 客户:那我交话费 我:手机号。这是电信的啊!!我这是中国移动!! 客户:我不管,我要充话费,充话费是你们的 我:可是这是移动!!中国移动!! 客户:我这是手机号 我:那又如何,这是移动!你是电信!!

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个