当前位置: 首页 > 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;}}}}
}
http://www.xdnf.cn/news/615205.html

相关文章:

  • 第二十一章 TIM——通用定时器
  • [原理理解] 超分使用到的RAM模型和LLAVA模型
  • Rules and Monetization
  • 5.2.3 使用配置文件方式整合MyBatis
  • 谷歌移动端排名和电脑端差距大?做SEO优化要选哪个?
  • Q网络(Q-Network)简介
  • Claude 4 系列 Opus 4 与 Sonnet 4正式发布:Claude 4新特性都有哪些?
  • AI独立游戏素材生成实操
  • LVGL(lv_textarea文本框控件)
  • Spring-面试题(76)
  • PTA刷题笔记2
  • AI智能体工具调研分享(未完待续)
  • 养生指南:五维打造健康新方式
  • Coze工作流文生图实战应用-哪吒表情包制作
  • LEED认证是什么?LEED认证难吗?LEED认证需要准备的资料
  • qt出现launching debugger,运行失败
  • 河道管网排口在线监测系统解决方案
  • 多路径可靠传输协议(比如 MPTCP)为什么低效
  • MIGO委外(外协)采购订单过账的增强
  • 如何选择和应用WAF技术:核心原理、应用场景与优劣势解析
  • 【接口设计文档】:在线聊天平台(Online-Chat)
  • IEC 61156-5:2020 标准技术解析与应用综述
  • 肠道微生物组研究的特有数据库
  • [C]基础15.C语言内存函数
  • centos原系统安装了Python3.7.9兼用在安装一个python3.8
  • 全面解析EDI RECADV报文:结构组成、业务应用与关键注意事项
  • Java中的集合(持续更新)
  • 如何使用WordPress区块(以及如何创建自定义区块)?
  • 常见算法题目2 - 给定一个字符串,找出其中最长的不重复子串
  • C++ std::find() 函数全解析