当前位置: 首页 > news >正文

[Java恶补day4] 283. 移动零

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序
请注意 ,必须在不复制数组的情况下原地对数组进行操作

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

示例 2:
输入: nums = [0]
输出: [0]

提示:
1 <= nums.length <= 104
-231 <= nums[i] <= 231 - 1

进阶:你能尽量减少完成的操作次数吗?


知识点:
数组、双指针


解:
采用双指针实现,初始时,左指针指向第一个元素,右指针指向第二个元素。
这里实际上已经考虑了一个元素的情况:只有一个元素时,不管是0还是非零元素,实际上不用动这个数组的内容,因此只考虑两个及以上元素数量的情况。
左指针,实际上指向的是0;右指针,实际上指向的是左指针指向的0后面第一个非零元素。
如何判断遍历结束了?通过判断右指针不等于数组长度,即可。原因在后面进行说明

这里对于指针指向的元素,分为3种情况:
case1:左指针指向0,右指针指向非零元素
这种情况下,需要交换左右指针指向的元素,实现非零元素向前移动、0向后移动。由于题目要求的是保证非零元素的相对顺序不变,而不同0的顺序实际上没区别,因此这种交换元素的方式是可取的。交换后,左指针就指向了非零元素,右指针指向了0,那么就来到了case3
case2:双指针均指向0
这种情况表示存在多个连续的0,那么交换0是没有实际意义的,为了减少交换次数,我们将右指针后移,直到后面的某次遍历时,右指针指向了非零元素,那么就来到了case1
case3:左指针指向非零元素
这种情况正是交换完0和非零元素后的结果,此时,左指针原来指向的0已经完成移动,标明左指针的使命已经完成,因此左指针后移。而双指针同时指向同一个元素,并没什么用,因此我们直接将右指针也后移。所以就有双指针同时后移

这里,以测试用例1进行说明,给出while循环的结束条件是如何确定的。
测试用例1推导过程
蓝色圈圈就说明了为什么右指针等于数组长度时,表明循环结束。

class Solution {public void moveZeroes(int[] nums) {//双指针分别指向第一个、第二个元素int pi = 0;int pj = 1;//数组只有一个元素则不处理(处理后数组不会变)if (nums.length > 1) {while (pj != nums.length) {if (nums[pi] == 0 && nums[pj] != 0) {//左指针指向0,右指针指向非零元素,直接交换双指针所指向的两个元素int tmp = nums[pi];nums[pi] = nums[pj];nums[pj] = tmp;} else if (nums[pi] == 0 && nums[pj] == 0) {//双指针均指向0,则更新右指针,直至遇到非零元素pj += 1;} else if (nums[pi] != 0) {//已进行元素交换,更新双指针pi += 1;pj += 1;}}}}
}

相关文章:

  • 水利水电安全员考试的案例分析题一般涉及哪些方面的知识?
  • 4408. 李白打酒加强版(dp)
  • 多路径可靠传输协议(比如 MPTCP)为什么低效
  • ISO 26262-5 评估硬件架构度量值
  • 频率分布直方图
  • 熔断器(Hystrix,Resilience4j)
  • Three.js 中的 Octree(八叉树)详解
  • deepseek组合使用
  • MySQL——复合查询表的内外连
  • python(29) : 使用webview打开网站
  • 电网绝缘子及破损、闪络缺陷YOLO数据集
  • 2025年渗透测试报告需求激增:企业如何科学选择渗透测试服务?
  • 基于大模型预测发育性髋脱位的多维度研究与应用报告
  • SAP在化工行业的数字化转型:无锡哲讯科技的赋能实践
  • 设计模式系列(05):工厂方法模式(Factory Method)
  • 传统工程项目管理与业财一体化管理的区别?
  • 高效获客利器:应用宝CPD广告的投放优化与流量质量保障
  • AI+制造:中小企业的低成本智能化转型
  • 智慧化工园区安全风险管控平台建设方案(Word)
  • 未来安全与持续进化
  • 外贸做的社交网站有哪些/谷歌推广方案
  • 如何办理医药网站icp备安的前置审批/最基本的网站设计
  • 公司网站建设设计/百度做广告怎么收费
  • asp.net个人网站怎么做/微信销售平台
  • 杨庄网站建设/新品怎么推广效果最好
  • wordpress搭建的网站能干什么/网页模板下载