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

双指针——移动零

一,题目要求:

  • 给定一个数组 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

二 ,算法原理

  • 定义两个指针
    • cur从左向右扫描数组,遍历数组
    • dest指向处理区间内,非0元素的最后一个元素
  • 将数组分成三个部分:
    • 【0,dest】:非0元素
    • 【dest+1,cur-1】:0元素
    • 【cur,n-1】:待处理

在这里插入图片描述

  • cur从左向右遍历:保持这三部分的状态不变,当遍历结束时,即完成非0元素与0元素的划分。

    • cur 遇到0元素:
      cur ++
    • cur 遇到非0元素:
      非0元素部分长度+1,并把cur当前所指的这个非0元素添加到这个新增的这个位置,即swap(dest+1,cur)。
      在这里插入图片描述

三 ,代码实现

public void moveZeroes(int[] nums) {// 遍历之前,非0元素部分长度为0,所以dest = -1for(int cur = 0,dest = -1;cur < nums.length;cur ++) {if(nums[nums] != 0) {dest ++;      // 非0元素部分长度+1// 交换新增位置处的0 和 cur当前指向的值int tmp = nums[cur];nums[cur] = nums[dest];nums[dest] = tmp;}}
}
http://www.lryc.cn/news/198956.html

相关文章:

  • WPF中在MVVM模式下实现导航功能
  • SpringBoot面试题2:SpringBoot与SpringCloud 区别?SpringBoot和Spring、SpringMVC的区别
  • Practical Deep Raw Image Denoisingon Mobile Devices
  • 如何在Android项目中制作和使用三方包(jar文件)
  • 消息队列Beanstalkd介绍
  • 【C++】继承 ⑥ ( 继承中的构造函数和析构函数 | 类型兼容性原则 | 父类指针 指向 子类对象 | 使用 子类对象 为 父类对象 进行初始化 )
  • 15 | JPA 对 Web MVC 开发者做了哪些支持
  • 链表的概念+MySingleList的实现
  • 小黑子—Maven基础
  • 【Netty专题】【网络编程】从OSI、TCP/IP网络模型开始到BIO、NIO(Netty前置知识)
  • 扬帆起航:许战海方法论日文版正式发布
  • Docker 安装zookeeper
  • 项目管理与SSM框架(二)| Spring
  • Ubuntu系统忘记Root用户密码-无法登录系统-更改Root密码-Ubuntu系统维护
  • webSocket 有哪些安全问题?
  • ArcGis打开影像显示全黑解决方法
  • 雷达基础导论及MATLAB仿真
  • 设计模式再探——适配器模式
  • 【无标题】光伏逆变器的IEC62109测试,逆变器IEC62109测试项目
  • Windows用VM虚拟机安装MacOS Ventura 13.6系统全流程教程(附资源)
  • PHP7和PHP8的新特性
  • mysql按照日期分组统计数据(date_formatstr_to_date)
  • 【C++程序员必修第一课】C++基础课程-07:switch 分支选择
  • initramfs介绍
  • 数据结构与算法:二分查找(心得)
  • 项目管理之分析项目特点的方法
  • MyBatisPlus(二十一)乐观锁
  • node 通过axios发送post请求(FormData)
  • 2024 王道考研-数据结构
  • 【疯狂Java讲义】Java学习记录(使用jar命令打包)