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

示例:

输入: [0,1,0,3,12]
输出: [1,3,12,0,0]

说明:

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

方法一:双指针

思路及解法

使用双指针,左指针指向当前已经处理好的序列的尾部,右指针指向待处理序列的头部。

右指针不断向右移动,每次右指针指向非零数,则将左右指针对应的数交换,同时左指针右移。

注意到以下性质:

左指针左边均为非零数;右指针左边直到左指针处均为零。

因此每次交换,都是将左指针的零与右指针的非零数交换,且非零数的相对顺序并未改变。

Java代码如下:

public void moveZeroes(int[] nums) {int n = nums.length, left = 0, right = 0;while (right < n) {if (nums[right] != 0) {swap(nums, left, right);left++;}right++;}}public void swap(int[] nums, int left, int right) {int temp = nums[left];nums[left] = nums[right];nums[right] = temp;}

方法二: 双指针
同样是双指针,可以对上面的代码进行优化:
因为交换到后面的数,值都是0。所以可以将非零数置前,但是原位置的数不变,右指针到末尾后,将左指针后面的数都置为0即可。
Java代码如下:

  public void moveZeroes(int[] nums) {int j = 0;//j为左指针for (int i = 0;i < nums.length;i ++)//i为右指针if (nums[i] != 0)nums[j ++] = nums[i];while (j < nums.length)nums[j ++] = 0;}

复杂度分析

时间复杂度:O(n),其中 n 为序列长度。每个位置至多被遍历两次。空间复杂度:O(1)。只需要常数的空间存放若干变量。

移动数组中的所有零到数组的末尾相关推荐

  1. php某列为键数组为值,PHP 将二维数组中某列值作为数组的键名 -- 超实用

    有时候,想通过数组的中某字段值, 然后再在二维数组中获取存在该字段值的数组: 一般能想到的就是foreach 遍历比较一下跟该字段值一样,就获取到想要的数组,如下: //测试二维数组 $arr =ar ...

  2. php 去掉数组中的空值_PHP删除数组中空值的方法介绍

    说来惭愧,以前在去掉数组的空值是都是强写foreach或者while的,利用这两个语法结构来删除数组中的空元素,简单代码如下: foreach( $arr as $k=>$v){ if( !$v ...

  3. C语言试题四十四之移动一维数组中的内容,若数组中由n个整数,要求把下标从0到p(p小于等于n-1)的数组元素平移到数组的最后。

    1. 题目 请编写一个函数function,它的功能是:移动一维数组中的内容,若数组中由n个整数,要求把下标从0到p(p小于等于n-1)的数组元素平移到数组的最后. 2 .温馨提示 C语言试题汇总里可 ...

  4. C语言:编写一个函数,计算二维数组中的最大元素,数组以指针的方式传递

    /*编写一个函数,计算二维数组中的最大元素,数组以指针的方式传递*/ #include<stdio.h> #define N 4 #define M 3 int findmax(int ( ...

  5. js将数组中相同项放在一个数组

    js将数组中相同项放在一个数组 原本数组长这样:图一 想将数组中相同项放在一个数组 得到:图二 转换中也可以得到:图三 方法: sortArr(arr, str) {var _arr = [],_t ...

  6. 输入一个整数数组,实现一个函数,来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分。

    输入一个整数数组,实现一个函数,来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分. 我们首先会想到常规方法:创建一个临时数组,遍历所给数组中的所有元素,将偶数 ...

  7. js从一个数组中筛选出另一个数组中存在的值

    js从一个数组中筛选出另一个数组中存在的值 这里从arr中筛选arr1中存在的值,arr2为筛选结果数组 let arr=["1","2","3&qu ...

  8. java数组中删除元素或一个数组元素

    java数组中删除元素或一个数组元素 删除数组中单个元素 删除数组中多个元素(数组表示) 这里直接介绍两种情况: 1.删除数组中单个元素 2.删除数组中多个元素(数组表示) 删除数组中单个元素 1. ...

  9. MongoDB 学习笔记之 从数组中删除元素和指定数组位置

    从数组中删除元素: 从数组中删除单个元素: db.ArrayTest.updateOne({ "name" : "Bill"},{$pop: {"ad ...

最新文章

  1. Velocity文档(3)
  2. 北京智源研究院招募社区编辑:我在国内AI研究者密度最大的办公室等你
  3. Java开发程序员最值得学习的10大技术
  4. Mysql对用户操作加审计功能——高级版
  5. 客户端的效果 ktv 1216
  6. TensorFlow: 薛定谔的管道
  7. 《BI那点儿事》数据挖掘各类算法——准确性验证
  8. 给爱设计的你,一个理由爱上(和使用)渐变素材的理由
  9. azure备份存储层分类_备份到Azure –为什么要这样做?
  10. 网络编程 udp学习笔记补充(帅帅老师讲堂)
  11. httpwatch使用_使用PHP#2自动化HTTPWatch
  12. 企业微信定时发送图片/文字信息
  13. LPC1768 MCUXpresso IDE环境下使用完整64K内存的方法
  14. 使用随机文件流类RandomAccessFile将一个文本文件倒置读出
  15. 百度地图:为标记添加点击事件显示标注
  16. 2021-04-29 微信登录简易版
  17. 如何使用热风枪焊接特殊的QFN封装的芯片
  18. error #6633: The type of the actual argument differs from the type of the dummy argument.
  19. 常用的网站和在线工具
  20. 一篇搞懂python文件读写操作(r/r+/rb/w/w+/wb/a/a+/ab)

热门文章

  1. Spring Redis工具类
  2. 记录【1】Vue遇到的bug , 点击按钮出现Cannot read property 'toString' of undefined的解决方法
  3. Unparseable date: Fri Nov 08 17:37:33 CST 2019
  4. 人机协作,小i机器人搭档杨澜主持上海科技节闭幕式
  5. 在使用Nacos拉取配置的时候报错
  6. Chrome 和 Edge 浏览器的一些User-Agent请求头
  7. Python实现英文文本的霍夫曼编码压缩
  8. 【天地图】使用天地图api绘制GeoJson数据
  9. Office Word和Excel的工具栏显示不全,只显示文件、绘图和帮助的解决办法
  10. 打脸谢尔顿的电池,了解一下