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

Given an array nums, write a function to move all 0's to the end of it while maintaining the relative order of the non-zero elements.

示例:

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

说明:

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

Note:

  1. You must do this in-place without making a copy of the array.
  2. Minimize the total number of operations.

解题思路:

​ 千万不要被题目局限了思维!题目让把所有0移到末尾,如果你的思路是遇零与末尾数字交换位置,然后还需要把非零数字排序,那么就被带偏了。

​ 换个思路,把非 0 数字前移,不去管数字 0

定义两个指针:指针 i 直接遍历数组遇到非 0 数字把该数字赋值给指针 j 所在的索引,索引 j 自增 1,i继续遍历。

这样遍历完之后,数组索引从0到 j 之间的数值即为所求得保持非零元素的相对顺序,而 j 之后的数值只需要全部赋值 0 即可。

Java:

class Solution {
public void moveZeroes(int[] nums) {
int numsLen = nums.length;
if (numsLen < 1) return;//数组长度小于一直接返回
int j = 0;
for (int i = 0; i < numsLen; i++) {//遍历数组
if (nums[i] != 0) {//如果该数不为0
nums[j++] = nums[i];//赋值给索引j
}
}
while (j < numsLen) nums[j++] = 0;//把从j到末尾所有数字赋值0
}
}

Python3:

class Solution:
def moveZeroes(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
if len(nums) < 1:
return
j = 0
for num in nums:
if num != 0:
nums[j] = num
j += 1
for i in range(j, len(nums)):
nums[i] = 0

如果题目不限制在原数组上操作,用python一行可解决:

nums = [i *for* i in nums *if* i != 0]+[i *for* i in nums *if* i == 0]

公众号: 爱写bug(ID:iCodeBugs)

最新文章

  1. 三:shell运算符
  2. Mac Pro 开机自启动 PHP-FPM,Nginx,MySql 等软件
  3. ciancd开源
  4. 【Spark】----Spark on Yarn
  5. Bootstrap Paginator 分页插件参数介绍及使用
  6. 在iframe下的页面锚点失效问题,用jquery进行修复
  7. [转]TCP、UDP数据包大小的确定
  8. 在Windows 上的 Python
  9. lnmp全面优化集合nginx+mysql+php
  10. window下编译ffmpeg 比较简单
  11. linux(centos)如何查看文件夹大小
  12. 大文件遍历shell脚本
  13. 关于一些Android冷知识
  14. 设计模式C++实现(1)——工厂模式
  15. Swift构造函数(Initializer)和析构函数(Deinitializer)
  16. 启动tomcat直接报错:org.apache.tomcat.util.digester.Digester startElement
  17. 用CSS3实现饼状loading效果
  18. 【GDOI】【图论-最短路】时间与空间之旅
  19. Java多线程并发工具类
  20. 【Python基础】lpthw - Exercise 45 制作游戏

热门文章

  1. 123: The filename, directory name, or volume label syntax is incorrect今天玩nginx的时候报错
  2. DevExpress的TextEdit控件没法调整高度解决
  3. 易优CMS:foreach的基础用法
  4. Vue笔记--通过自定义指令实现按钮操作权限
  5. DOS(磁盘操作系统)基本命令-思维导图
  6. nginx location 配置详解
  7. 16.Java基础_对象内存图
  8. alertmanager
  9. Jenkins之插件Publish HTML reports的使用
  10. office 小技巧