[路飞]_leetcode-283-移动零

简介: leetcode-283-移动零

网络异常,图片无法展示
|


「这是我参与2022首次更文挑战的第20天,活动详情查看:2022首次更文挑战


[题目地址][B站地址]


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


示例:


输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
复制代码


说明:


  1. 必须在原数组上操作,不能拷贝额外的数组。
  2. 尽量减少操作次数。


sort 排序


解题思路


这里我们首先可以想到借助 sort 来进行排序,a,b 总共有如下 4 种情况:


  1. a,b 都是 0
  2. a,b 都是 非0
  3. a0b非0
  4. a非0``,b0`


第 1,2 种情况,我们可以保持它们之前的相对位置,减少操作次数,


第 3,4 中则要保证 非 00 的前面。


代码实现


var moveZeroes = function (nums) {
  nums.sort((a, b) => {
    // 如果两个元素都是 非0 或者都是 0,保持相对位置不变,减小操作次数
    if ((a && b) || (a===0 && b===0)) return 0
    // 如果前面是 0 后面是 非0,返回 1,保证 非0 在前,0 在后
    if (a===0 && b) return 1
    // 如果前面是 非0 后面是 0,返回 -1,保证 非0 在前,0 在后
    return -1
  })
}
复制代码


交换位置


解题思路


本题我们还可以通过双指针交换元素方法解题。


定义指针 l 指向 0r 指向 非0 元素。


l 指向值为 0 的元素,r 指向值为 非0 的元素的时候,判断 l<r && r<len,如果条件成立,则此时找到了一组 0 前 非0 后 的情况,交换两个元素位置。


lr 继续向后查找,直到处理完输入数组,就完成了移动所有 0 到数组末尾的操作。


代码实现


var moveZeroes = function (nums) {
  const len = nums.length
  // l 指向 0,r 指向 非0
  let l = 0,
    r = 0
  // r 指针扫描整个数组
  while (r < len) {
    // l 向后找到为 0 的元素
    while (l < len && nums[l] !== 0) l++
    // r 向后找到 非0 的元素
    while (r < len && nums[r] === 0) r++
    // 如果当前 l<r(即 0 前 非0 后),并且 r 合法,交换两元素位置
    if (l < r && r < len) {
      ;[nums[l], nums[r]] = [nums[r], nums[l]]
    }
    // 向后移动 r 查找新的 非0 元素
    r++
  }
}
复制代码


至此我们就完成了 leetcode-283-移动零


如有任何问题或建议,欢迎留言讨论!👏🏻👏🏻👏🏻

相关文章
|
人工智能 监控 数据可视化
绩效考核管理的动态调整与持续优化
本文探讨了绩效考核管理在现代企业管理中的重要性,从核心原则、流程设计、指标设定、沟通反馈及持续优化五个方面进行了详细阐述,并推荐了板栗看板作为提升绩效管理效率的工具。文章强调了公平公正、客观量化、战略导向、持续反馈和结果应用的原则,以及平衡计分卡、KPI、OKR和360度反馈等多种考核方法的应用。板栗看板以其强大的可视化、动态追踪、高效沟通和数据分析功能,助力企业实现高效的绩效管理。
|
存储 监控 NoSQL
Redis脑裂:预防与解决之道
在分布式系统中,Redis集群的脑裂问题是一个令人头疼的难题。它指的是由于网络分区或其他原因,导致集群中的节点无法正常通信,从而形成多个子集群,每个子集群都认为自己是主集群,进而引发数据不一致和服务可用性下降的问题。那么,如何有效预防Redis脑裂问题?当问题发生时,我们能否迅速解决?本文将围绕这一主题,分享一些实用的技术干货。
614 2
|
数据采集 JSON 数据可视化
基于Python的51job招聘数据采集与可视化项目实践
本文介绍了一个基于Python的51job招聘数据采集与可视化项目,该项目通过自动化手段获取大量招聘信息,并运用数据分析和可视化工具对就业市场进行深度分析,旨在为求职者和企业提供数据支持和决策依据。
814 5
|
计算机视觉
【YOLOv8改进】 SAConv(Switchable Atrous Convolution):可切换的空洞卷积
**DetectoRS是目标检测的先进网络,融合递归特征金字塔和可切换空洞卷积。递归金字塔在FPN基础上增加反馈,增强特征表示。SAC使用不同空洞率卷积并用开关函数融合,适应不同尺度目标。在COCO数据集上,DetectoRS达到55.7%的Box AP,48.5%的Mask AP和50.0%的
|
前端开发 JavaScript 开发工具
从零开始:构建、打包并上传个人前端组件库至私有npm仓库的完整指南
从零开始:构建、打包并上传个人前端组件库至私有npm仓库的完整指南
2778 0
|
JavaScript API
vue的select下拉框多选项-multiple属性
vue的select下拉框多选项-multiple属性
928 0
商标注册流程及费用包括申请材料清单和规费标准
商标注册可以自己申请,也可以委托第三方知识产权代理公司申请。自己申请准备好材料后,在国家知识产权局商标局办理,先提出申请,商标局进行形式审查,符合要求后进入实质审查阶段,大约是6个月,申请通过后进入商标公式阶段,时间是3个月。阿里云百科来详细说下商标注册流程及费用、商标申请所需材料清单以及商标局规费说明:
738 0
商标注册流程及费用包括申请材料清单和规费标准
|
Ubuntu 网络协议 Linux
win10远程桌面控制Ubuntu服务器 - 内网穿透实现公网远程
win10远程桌面控制Ubuntu服务器 - 内网穿透实现公网远程
1399 0
|
弹性计算 网络协议 Linux
阿里云服务器安装PPTP VPN全流程
阿里云服务器安装PPTP VPN全流程,现在安全组中开放PPTP的1723端口,然后在服务器上安装PPTP服务端,最后配置客户端即可
18842 1
阿里云服务器安装PPTP VPN全流程
|
前端开发 Java 中间件
springboot集成minio SDK实现文件上传下载(下)
springboot集成minio SDK实现文件上传下载
638 0