算法-双指针-简单-移动零

记录一下算法题的学习2

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

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例 1:

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

示例 2:

输入: nums = [0]
输出: [0]

分析思考:

什么是双指针?

双指针即用两个不同速度不同方向的指针对数组或对象进行访问,通过两个不同指针的碰撞从而达到特定的目的。

左右指针通常在数组有序的情况下,从最小和最大端同时对数组进行处理,对满足特定条件的数组元素进行成对处理,而快慢指针逐渐靠拢直至发生碰撞,则遍历完所有数组

我们在这里使用左右指针

初级代码展示

class Solution {public void moveZeroes(int[] nums) {int i=0;int j=0;//判断该数组是否为空或者只有一个值,就不需要排序if(nums==null||nums.length<=1){System.out.println("数组为空或数组只有一个值,不需要移动顺序");}//第一次遍历,j指针记录非0的个数,只要是非0的都赋给nums[j],这里nums[j++]实际上最开始就是nums[0],而不是nums[1];for(i=0;i<nums.length;i++){if(nums[i]!=0){nums[j++]=nums[i];}}//第二次遍历,由于非0元素都统计完了,剩下都是零,第二次遍历把末尾元素都赋值0for(i=j;i<nums.length;++i){nums[i]=0;}//第三次遍历,把得到的移动零的正确数组遍历出来for(j=0;j<nums.length;j++){System.out.println(nums[j] );}}
}

上一个代码,经过多次遍历,时间过慢,(太搞笑了!)

我们进阶代码展示

class Solution {public void moveZeroes(int[] nums) {int index=0,temp=0;for(int i=0;i<nums.length;i++ ){if(nums[i]!=0){temp=nums[i];nums[i]=nums[index];nums[index]=temp;index++;}}return;}
}

仔细分析:

右指针遍历出每一个 !=0 的数,与左指针(从下标 0 开始)交换,每交换一次就要左指针 ++ 

 举例展示nums=[0,1,0,3,12]

nums值010312
索引01234

当遍历出第一个!=0的数时,与左指针(从下标 0 开始)交换,结果展示

nums值100312
索引01234

 当遍历出第二个!=0的数时,与左指针下标 1 交换,结果展示

nums值130012
索引01234

 当遍历出第三个!=0的数时,与左指针下标 2 交换,结果展示

nums值131200
索引01234

直至整个遍历完为止。 

结语:

还可以查看

移动零算法_冰鲜柠檬汁的博客-CSDN博客

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

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

相关文章

【LeetCode刷题-滑动窗口】--1423.可获得的最大点数

1423.可获得的最大点数 思路&#xff1a; 数组cardPoints的长度为n&#xff0c;由于只能从开头和末尾拿k张卡牌&#xff0c;所以最后剩下的必然是连续的n-k张卡牌&#xff0c;可以通过求出剩余卡牌点数之和的最小值&#xff0c;来求出拿走卡牌点数之和的最大值 算法&#xff…

上位机模块之圆形测量,基于halcon的二次开发

夸克网盘可自取。链接&#xff1a;https://pan.quark.cn/s/ac192950e051 //在此之前可以先浏览2篇博客&#xff0c;分别是序列化与反序列化和ROI绘制获取 https://blog.csdn.net/m0_51559565/article/details/134422834 //序列化与反序列化 https://blog.csdn.net/m0_51559565…

(论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking

文献阅读笔记&#xff08;分层卷积特征&#xff09; 简介 题目 Hierarchical Convolutional Features for Visual Tracking 作者 Chao Ma, Jia-Bin Huang, Xiaokang Yang and Ming-Hsuan Yang 原文链接 arxiv.org/pdf/1707.03816.pdf 关键词 Hierarchical convolution…

ubuntu上如何移植thttpd

thttpd的特点 thttpd 是一个简单、小巧、便携、快速且安全的 HTTP 服务器。 简单&#xff1a; 它只处理实现 HTTP/1.1 所需的最低限度。好吧&#xff0c;也许比最低限度多一点。 小&#xff1a; 请参阅比较图表。它还具有非常小的运行时大小&#xff0c;因为它不会分叉并且非…

一道 python 数据分析的题目

python 数据分析的题目。 做题方法&#xff1a;使用 pandas 读取数据&#xff0c;然后分析。 知识点&#xff1a;pandas&#xff0c;正则表达式&#xff0c;py知识。 过程&#xff1a;不断使用 GPT&#xff0c;遇到有问题的地方自己分析&#xff0c;把分析的结果告诉 GPT&am…

【java学习—十四】java动态代理(6)

文章目录 1. 相关概念2. 步骤3. 举例 问题&#xff1a; 假设一个java项目有100个java类&#xff0c;每个java有10个方法&#xff0c;这总共有1000个方法&#xff0c;现在有这样一个需求&#xff0c;需要在每个java方法加上2句话&#xff1a;在方法执行前输出这个方法开始执行&a…

【Web 实战】记一次攻防实战

经典开局一个登录框 由于漏洞应该还未修复。对于数据和相关网址打个码见谅一下 常规思路&#xff08;爆破&#xff09; 常规操作进行一波 尝试弱口令然后开始爆破 对于此种有验证码的爆破&#xff0c;可以借用一个bp插件。 captcha-killer-modified-jdk14.jar 具体使用我就…

【数据结构】希尔排序(最小增量排序)

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;数据结构 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵 希望大佬指点一二 如果文章对你有帮助…

Linux下SPI环回测试

文章目录 前言一、回环测试代码1.1 头文件 spidev.h2.2 c代码 spidev_test.c 二、 编译验证2.1 交叉编译2.2 测试 前言 linux下做spi回环测试 一、回环测试代码 1.1 头文件 spidev.h /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ /** include/linux/spi…

Vue3:父组件向子组件传值(Props)

背景 在Vue3项目里&#xff0c;页面A&#xff08;在views文件夹里&#xff09;需要读取某个接口的数据&#xff0c;而页面A引入的组件a&#xff08;在components文件夹里&#xff09;也需要读取该接口的数据为了避免重复读取数据从而造成资源浪费&#xff0c;可以利用传值来实…

halcon识别验证码,先训练后识别

识别验证码图片&#xff0c;使用halcon 21.05 下面代码识别准确率100% 目录 训练&#xff0c;图片打标签使用代码创建分类器&#xff1b;识别验证码&#xff0c;检验识别效果使用“助手”加载训练文件&#xff0c;加载训练分类器&#xff0c;察看收集的字符&#xff0c;训练识别…

软件测试需求分析

1.1 需求的重要性 1.1.1 软件缺陷的8020原则 1) 在软件测试过程中&#xff0c;从需求分析开始到集成测试阶段引入测试手段&#xff0c;能发现所有缺陷的80%&#xff1b;系统测试阶段引入测试手段&#xff0c;能发现剩余缺陷中80%的缺陷&#xff1b;在运行维护阶段经过长…