网站制作服务公司/上海网站推广系统

网站制作服务公司,上海网站推广系统,wordpress评论框添加表情评论,西安门户网站开发目录 文章前言 题目描述 算法原理讲解 忽略限制条件的解法 原理讲解 思路总结 代码展示 双指针解法 原理讲解 思路总结 代码展示 大总结 💫只有认知的突破💫才来带来真正的成长💫编程技术的学习💫没有捷径💫…

目录

文章前言

题目描述 

算法原理讲解

忽略限制条件的解法

原理讲解

 思路总结

 代码展示

双指针解法

原理讲解

思路总结

 代码展示

大总结


💫只有认知的突破💫才来带来真正的成长💫编程技术的学习💫没有捷径💫一起加油💫

           🍁感谢各位的观看🍁欢迎大家留言🍁咱们一起加油🍁努力成为更好的自己🍁

文章前言

为了提高自己的编程技术和能力,本博主开始要更新相关算法题的内容了。我会分类型的进行算法题的讲解,由于博主是第一次真正意义上接触系统的刷题训练,作为一个小白,有不足或错误的地方,很愿意听取在座各位大佬的批评和指教。废话不多说,让我们开启刷算法题的旅行吧!

题目描述 

题目链接:移动零

如图所示的要求:

给你一个数组,要求把这个数组的0元素,全部移动到数组的后面,非0元素全部移动到数组的前面,而且这些非0元素的相对顺序保持不变注意:不能新开辟一个数组,然后再把这新数组里面的元素拷贝到以前的数组中,这是不允许的,只能在原数组上进行操作。

算法原理讲解

忽略限制条件的解法

本博主在一开始写这个题目的时候,就没有注意到限制条件——不允许开辟数组。虽然,这个解法能在Leetcode上能通过,但是不符合题目要求。我想把这个写法也保留下来,它也算是一种思想,万一在别的题目就合适呢!

原理讲解

创建一个和原数组空间大小一样的新数组,在这个新数组上,创建两个“指针”这里的指针不是真正的指针,就是通过下标访问的变量。第一个指针begin_num指向数组的首元素第二个指针end_num指向数组的最后一个元素,如图所示(以示例1为例):

然后再去遍历原数组,遇到0元素,就存放在end_num,然后end_num再向前 -  - ,为存储下一个0元素做准备,当遇到非0元素时,就存放在begin_num,然后begin_num向后走 + +,为下一个非0元素做准备,直到原数组遍历完毕。如图所示:

 思路总结

1.新建立和原数组一样大的数组

2.创建两个“指针”,分别指向新数组的头和尾处的空间

3.依次遍历原数组

                3.1:遇到0元素,就插入end_num,然后end_num- -

                3.2:遇到非0元素,就插入begin_num,然后begin_num++

4.原数组访问完毕就结束

5.在把新数组排好序的元素赋值拷贝给原数组

 代码展示

class Solution {
public:void moveZeroes(vector<int>& nums) {vector<int>num(nums.size(),1);  //开辟一样大小的新数组//创建两个指针auto end_num=num.end()-1;    //指向新数组的首元素auto begin_num=num.begin();    //指向新数组的尾元素for(auto&e:nums){if(e==0)        //0元素插入end_num{*end_num=e;end_num--;}else            //非0元素插入begin_num{*begin_num=e;begin_num++;}}nums=num;        //把排好序的新数组赋值拷贝给原数组}
};

双指针解法

原理讲解

我们解题时,所谓的双指针并不是真正的指针不是int*,char*……而是指向数组的下标变量,比如,0,1,2……。所以大家不要感到害怕。

因为题目要求只能在原数组进行操作,所以我们就要摒弃开辟新数组的思想了。根据题目要求:非0元素全部在数组的左边,0元素全部在数组的右边。使用新的思想:数组划分(数组分块)的思想,这个数组被划分为两个区域,一块是非0区域,另一块是0区域,如图所示:

这个时候,创建两个指针,一个是cur,另一个是dst。cur指针的作用:它把数组分为已处理和待处理的两个部分dst指针的作用:它把已处理过的数组分为,左边全是非0元素(保持相对顺序)和右边全是0元素的两个部分。所以,这俩指针把数组分为3个部分。如图所示:

所以数组被分为三个区间:[0,dst] , [dst+1,cur-1] , [cur,n-1][0,dst]全是非0元素[dst+1,cur-1]全是0元素[cur,n-1]待处理。其中,dst指向非0元素区间的最后一个非0元素。在遍历数组的过程中,始终保持这三个区间的性质不变,就会达到题目要求。让cur=0指向首元素位置,因为要起始遍历数组。对于dst,要使它指向首元素的前一个位置,dst=-1。因为dst指向的是非0元素,在起始位置,是无法确定起始元素是否为非0元素,所以就把dst放在前面。如图所示:

当cur指向的元素是0时,dst不动。当cur指向的元素非0时,dst++,然后cur和dst指向的元素进行交换,然后cur继续往后走,直到遍历完数组结束。

思路总结

1.cur=0指向首元素,dst=-1指向数组前面

2.cur指向的元素为0 , dst不动

3.cur指向的元素非0,dst++

                 3.1:然后swap(dst元素,cur元素)

                 3.2:cur++往后走

4.cur遍历完数组结束

 代码展示

class Solution {
public:void moveZeroes(vector<int>& nums) {for(int dst=-1,cur=0;cur<nums.size();cur++)if(nums[cur])swap(nums[++dst],nums[cur]);}
};

大总结

根据本题目的叙述和要求,具有很明显的数组划分的特点我们要进行合理的区间划分,在遍历数组的过程中,要保持各个区间的性质不变,才会有对的结局这里要注意dst的起始位置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/74556.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jangow-01-1.0.1靶机攻略

1.进行配置&#xff0c;按住shift&#xff0c;在图一界面按e进去得到图二 .ro 替换为 rw signie init/bin/bash ctrlx&#xff0c;ip a查看网卡信息&#xff0c;修改配置文件网卡信息 修改为如图所示内容后按shift?然后输入wq点击回车退出&#xff0c;然后重启靶机 2.在kali中…

安全上网沙箱:多方面解决政企私的上网问题

在数字化的浪潮中&#xff0c;网络已成为我们工作与生活不可或缺的一部分。然而&#xff0c;网络的便捷也伴随着诸多安全隐患&#xff0c;尤其是对于企业、个人以及政企机构而言&#xff0c;安全上外网成为了至关重要的课题。 隔离保护&#xff1a;构建安全堡垒 沙箱技术在内网…

C++ string的模拟实现

Hello!!大家早上中午晚上好&#xff0c;昨天复习了string的使用&#xff0c;今天来模拟实现一下string&#xff01;&#xff01;&#xff01; 一、string的框架搭建 1.1首先我们需要一个string的头文件用来做变量、函数、类等声明&#xff1b;再需要一个test文件来做测试,还需…

Java 中装饰者模式与策略模式在埋点系统中的应用

前言 在软件开发中&#xff0c;装饰者模式和策略模式是两种常用的设计模式&#xff0c;它们在特定的业务场景下能够发挥巨大的作用。本文将通过一个实际的埋点系统案例&#xff0c;探讨如何在 Java 中运用装饰者模式和策略模式&#xff0c;以及如何结合工厂方法模式来优化代码…

田间机器人幼苗视觉检测与护苗施肥装置研究(大纲)

田间机器人幼苗视觉检测与护苗施肥装置研究 基于多光谱视觉与精准施肥的农业机器人系统设计 第一章 绪论 1.1 研究背景与意义 农业智能化需求&#xff1a; 传统幼苗检测依赖人工&#xff0c;效率低且易遗漏弱苗/病苗施肥不精准导致资源浪费和环境污染 技术挑战&#xff1a;…

如何在Linux CentOS上安装和配置Redis

如何在Linux CentOS上安装和配置Redis 大家好&#xff0c;我是曾续缘。欢迎来到本教程&#xff01;今天我将向您介绍在Linux CentOS上安装和配置Redis的详细步骤。Redis是一个高性能的键值存储系统&#xff0c;常用于缓存、消息队列和数据持久化等应用场景。让我们一起开始吧&…

如何快速下载并安装 Postman?

从下载、安装、启动 Postman 这三个方面为大家详细讲解下载安装 Postman 每一步操作&#xff0c;帮助初学者快速上手。 Postman 下载及安装教程(2025最新)

使用Gitee Go流水线部署个人项目到服务器指南

使用Gitee Go流水线部署个人项目到服务器指南 前言&#xff01;&#xff01;&#xff01; 本文解决的问题&#xff1a; 你有一台ECS服务器&#xff0c;你在上面部署了一个Java服务也就是一个jar&#xff0c;你觉着你每次手动本地打包&#xff0c;上传&#xff0c;在通过命令去…

在 ASP .NET Core 9.0 中使用 Scalar 创建漂亮的 API 文档

示例代码&#xff1a;https://download.csdn.net/download/hefeng_aspnet/90407900 Scalar 是一款可帮助我们为 API 创建精美文档的工具。与感觉有些过时的默认 Swagger 文档不同&#xff0c;Scalar 为 API 文档提供了全新而现代的 UI。其简洁的设计让开发人员可以轻松找到测试…

Rabbitmq消息被消费时抛异常,进入Unacked 状态,进而导致消费者不断尝试消费(下)

一、消费流程图 消息在消费出现异常的时候&#xff0c;将一直保留在消息队列&#xff0c;所以你会看到以下奇怪的现象&#xff1a; 消息队列仅有5个消息&#xff0c; 投递速度也非常快&#xff0c;结果却一直无法消费掉。 二、重试策略 重试机制的使用场景&#xff1a;重试机制…

【STM32】知识点介绍二:GPIO引脚介绍

文章目录 一、概述二、GPIO的工作模式三、寄存器编程 一、概述 GPIO&#xff08;英语&#xff1a;General-purpose input/output&#xff09;,即通用I/O(输入/输出)端口&#xff0c;是STM32可控制的引脚。STM32芯片的GPIO引脚与外部设备连接起来&#xff0c;可实现与外部通讯、…

【赵渝强老师】达梦数据库的数据库对象

达梦数据库中包含各种数据库对象&#xff0c;主要分为两大类型&#xff1a;基本数据库对象和复杂数据库对象。下面分别进行介绍。 视频讲解如下 【赵渝强老师】达梦数据库的数据库对象 一、 基本数据库对象 常见的基本数据库对象有&#xff1a;表、索引、视图、序列、同义词等…

26考研——树与二叉树_树、森林(5)

408答疑 文章目录 二、树、森林树的基本概念树的定义和特性树的定义树的特性 基本术语树的基本术语和概念祖先、子孙、双亲、孩子、兄弟和堂兄弟结点的层次、度、深度和高度树的度和高度分支结点和叶结点有序树和无序树路径和路径长度 森林的基本术语和概念森林的定义森林与树的…

【HarmonyOS Next之旅】DevEco Studio使用指南(六)

目录 1 -> 在模块中添加Ability 1.1 -> Stage模型添加UIAbility 1.1.1 -> 在模块中添加UIAbility 1.1.2 -> 在模块中添加Extension Ability 2 -> 创建服务卡片 2.1 -> 概述 2.2 -> 使用约束 2.3 -> 创建服务卡片 2.4 -> 创建动态/静态卡片…

Excel多级联动下拉菜单的自动化设置(使用Python中的openpyxl模块)

1 主要目的 在Excel中&#xff0c;经常会遇到需要制作多级联动下拉菜单的情况&#xff0c;要求单元格内填写的内容只能从指定的多个选项中进行选择&#xff0c;并且需要设置多级目录&#xff0c;其中下级目录的选项内容要根据上级目录的填写内容确定&#xff0c;如下图所示&am…

3.25-1 postman执行+弱网测试

1.导出json脚本 2.打包json文件 3.下载的文件 二 .导入脚本 选择文件 点击导入 导入的接口 三.多接口运行 &#xff08;1&#xff09;集合右键&#xff0c;点击run &#xff0c;运行多个接口 2.编辑环境&#xff0c;集合&#xff0c;执行次数等 运行多个接口 四.运行多个接口…

Pear Admin Flask 开发问题

下载代码请复制以下命令到终端执行 git clone https://gitee.com/pear-admin/pear-admin-flask 于是我下载git 完成安装后&#xff1a; 安装 Git 后出现的页面是 “Git for Windows 的版本发布说明&#xff08;Release Notes&#xff09;”&#xff0c;通常会在安装完成后自动弹…

【C语言】文件操作(详解)

个人主页 今天我们来讲一下有关文件的相关操作&#xff0c;希望看完这篇文章对你有所帮助&#xff0c;大力感谢你对博主的支持&#xff01; 文章目录 ⭐一、为什么使用文件&#x1f389;二、什么是文件2.1 程序文件2.2 数据文件2.3 文件名 &#x1f3a1;三、二进制文件和文本…

基于web的家政服务网站

内容摘要 由于互联网的使用&#xff0c;人们在管理、应用、服务等领域使用数据更加简洁、方便&#xff0c;大大提高了工作效率。互联网正逐渐融入我们的生活&#xff0c;影响和改变我们的生活。 家政服务管理系统是典型的信息管理系统&#xff08;MIS&#xff09;。其开发主要…

【leetcode hot 100 739】每日温度

解法一&#xff1a;暴力解法 class Solution {public int[] dailyTemperatures(int[] temperatures) {int ntemperatures.length; // 指向要找下一个更高温度的地方int[] result new int[n];for(int left0;left<n;left){int rightleft1; // 指向正在找最高温度的地方wh…