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

LeetCode每日一题之 移动0

前言:

  我的每日一题专栏正式开始更新,我会分享关于我在LeetCode上刷题时的经验,将经典题型拿出来详细讲解,来提升自己及大家的算法能力,希望这篇博客对大家有帮助。

题目介绍: 

题目链接:. - 力扣(LeetCode)

算法原理:

  很明显这是一类数组划分的题目,那么这类题目常用解法,可以使用双指针法,注意这里提到的双指针是下标(索引),不是c语言中的指针。

  总所周知,两个指针会将整个数组分为3个区域,如下图:

 如果我们我们能将数组的元素,按如下图划分:

 也就是dest指向已处理的非0元素的最后一个,cur指向未处理元素的第一个,按照这样的规则走下去,当cur走到数组末端的时候,整个数组就变成了我们想要的样子。

那么如何遵循这样的规则往下走了,就是我们的算法体现了,看下面这个例子:

两个指针初始状态:

dest   -1  (dest指向已处理的最后一个元素,现在没有已处理的元素,所以指向-1)

cur  0 (cur要遍历整个数组,所以从0开始)

 下面介绍每个指针的行动规则:

cur:cur遇到0,cur++

dest:cur遇到非0,++dest,然后交换dest和cur对应的值,交换完后cur++

下面用上面的例子走一遍:

cur遇到第一个元素0,cur++:

cur遇到第二个元素1,非0, ++dest,然后交换dest和cur对应的值再cur++:

其实不难看出这已经到了我们上面的理想状态了,区域1是已处理的元素,区域2是0,区域3是未处理的,且dest指向已处理元素的最后一个,cur指向未处理元素的第一个。

继续, cur遇到第三个元素0,cur++:

 

cur遇到第四个元素3,非0, ++dest,然后交换dest和cur对应的值再cur++: 

 

cur遇到第五个元素0,cur++: 

cur遇到第六个元素12,非0, ++dest,然后交换dest和cur对应的值再cur++:  

此时cur走到数组末端,结束,该数组也被我们处理完毕。 

代码实现:

 c语言:

void swap(int* a,int* b)//交换函数
{int tmp=*a;*a=*b;*b=tmp;
}
void moveZeroes(int* nums, int numsSize) {int dest=-1,cur=0;//两个指针的初始位置while(cur<numsSize){if(nums[cur]!=0)//遇到非0时{++dest;swap(&nums[dest],&nums[cur]);}cur++;//无论怎样cur都需要++,所以可以直接写在这}
}

相关文章:

  • C++之结构体以及通讯录管理系统
  • 第四十七回 一丈青单捉王矮虎 宋公明二打祝家庄-强大而灵活的python装饰器
  • 在git中自动把CRLF转换到LF的方法
  • iOS-UILabel调整行间距
  • RK3568开发笔记-qt程序运行报错Failed to move cursor on screen
  • 100243. 将元素分配到两个数组中 I
  • 经典的算法面试题(1)
  • C++从零开始的打怪升级之路(day41)
  • 算法知识(java)随笔
  • 知识图谱1——neo4j
  • 边缘计算网关的重要作用-天拓四方
  • redis一些概念知识
  • PostgreSQL对已有表增加自增序列
  • WPF应用程序使用MVVM模式
  • etcd入门-(1)安装篇
  • php的引用
  • 2017 前端面试准备 - 收藏集 - 掘金
  • C++类中的特殊成员函数
  • CSS实用技巧
  • ECMAScript6(0):ES6简明参考手册
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • JavaScript类型识别
  • Java方法详解
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • Linux CTF 逆向入门
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • React中的“虫洞”——Context
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 对JS继承的一点思考
  • 给github项目添加CI badge
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 两列自适应布局方案整理
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 我感觉这是史上最牛的防sql注入方法类
  • 延迟脚本的方式
  • Java总结 - String - 这篇请使劲喷我
  • ​VRRP 虚拟路由冗余协议(华为)
  • ​香农与信息论三大定律
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (论文阅读30/100)Convolutional Pose Machines
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (一)基于IDEA的JAVA基础10
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .libPaths()设置包加载目录
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .net CHARTING图表控件下载地址
  • .Net 中的反射(动态创建类型实例) - Part.4(转自http://www.tracefact.net/CLR-and-Framework/Reflection-Part4.aspx)...
  • .NET基础篇——反射的奥妙
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • .NET开源快速、强大、免费的电子表格组件
  • @Async注解的坑,小心