双指针 | 移动零 | 复写零

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

相关文章

我在移动打工的日志

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

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

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

C语言指针入门 《C语言非常道》

C语言指针入门 《C语言非常道》 作为一个程序员,我接触 C 语言有十年了。有的朋友让我推荐 C 语言的参考书,我不敢乱推荐,尤其是国内作者写的书,往往七拼八凑,漏洞百出。 但是,李忠老师的《C语言非常道》值得一读。对了,李老师有个官网,网址是: 李忠老师官网 最棒的是,有配套的教学视频,可以试看。 试看点这里 接下来言归正传,讲解指针。以下内容很多都参考了李忠老师的《C语言非

用Unity2D制作一个人物,实现移动、跳起、人物静止和动起来时的动画:中(人物移动、跳起、静止动作)

上回我们学到创建一个地形和一个人物,今天我们实现一下人物实现移动和跳起,依次点击,我们准备创建一个C#文件 创建好我们点击进去,就会跳转到我们的Vision Studio,然后输入这些代码 using UnityEngine;public class Move : MonoBehaviour // 定义一个名为Move的类,继承自MonoBehaviour{private Rigidbo

简单的角色响应鼠标而移动

actor类 //处理移动距离,核心是找到角色坐标在世界坐标的向量的投影(x,y,z),然后在世界坐标中合成,此CC是在地面行走,所以Y轴投影始终置为0; using UnityEngine; using System.Collections; public class actor : MonoBehaviour { public float speed=0.1f; CharacterCo

C和指针:字符串

字符串、字符和字节 字符串基础 字符串就是一串零个或多个字符,并且以一个位模式为全0的NUL字节结尾。 字符串长度就是字符串中字符数。 size_t strlen( char const *string ); string为指针常量(const修饰string),指向的string是常量不能修改。size_t是无符号数,定义在stddef.h。 #include <stddef.h>

【C++】作用域指针、智能指针、共享指针、弱指针

十、智能指针、共享指针 从上篇文章 【C++】如何用C++创建对象,理解作用域、堆栈、内存分配-CSDN博客 中我们知道,你的对象是创建在栈上还是在堆上,最大的区别就是对象的作用域不一样。所以在C++中,一旦程序进入另外一个作用域,那其他作用域的对象就自动销毁了。这种机制有好有坏。我们可以利用这个机制,比如可以自动化我们的代码,像智能指针、作用域锁(scoped_lock)等都是利用了这种机制。

MFC中App,Doc,MainFrame,View各指针的互相获取

纸上得来终觉浅,为了熟悉获取方法,我建了个SDI。 首先说明这四个类的执行顺序是App->Doc->Main->View 另外添加CDialog类获得各个指针的方法。 多文档的获取有点小区别,有时间也总结一下。 //  App void CSDIApp::OnApp() {      //  App      //  Doc     CDocument *pD

C和指针:结构体(struct)和联合(union)

结构体和联合 结构体 结构体包含一些数据成员,每个成员可能具有不同的类型。 数组的元素长度相同,可以通过下标访问(转换为指针)。但是结构体的成员可能长度不同,所以不能用下标来访问它们。成员有自己的名字,可以通过名字访问成员。 结构声明 在声明结构时,必须列出它包含的所有成员。 struct tag {member-list} variable-list ; 定义一个结构体变量x(包含

物联网之流水LED灯、正常流水灯、反复流水灯、移动流水灯

MENU 硬件电路设计软件程序设计正常流水LED灯反复流水LED灯移动流水LED灯 硬件电路设计 材料名称数量直插式LED1kΩ电阻杜邦线(跳线)若干面包板1 每一个LED的正极与开发板一个GPIO引脚相连,并串联一个电阻,负极接GND。 当然也可以选择只使用一个电阻。 软件程序设计 正常流水LED灯 因为要用到多个GPIO引脚,所以最好把所有的GPI