这是悦乐书的第201次更新,第211篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第67题(顺位题号是283)。给定一个数组nums,写一个函数将所有0移动到它的末尾,同时保持非零元素的相对顺序。例如:

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

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

注意

  • 您必须在不制作数组副本的情况下就地执行此操作。

  • 最小化操作总数。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

借助一个新数组和计数变量count,将不为0的数先存入新数组,然后将新数组中前count位赋值给数组的对应位,再将剩下的全赋值为0即可。

此解法的时间复杂度是O(n),空间复杂度是O(n)。

public void moveZeroes(int[] nums) {
if (nums == null || nums.length == 0) {
return ;
}
int[] newnums = new int[nums.length];
int count = 0;
for (int i=0; i<nums.length; i++) {
if (nums[i] != 0) {
newnums[count] = nums[i];
count++;
}
}
for (int j=0; j<nums.length; j++) {
if (j < count) {
nums[j] = newnums[j];
} else {
nums[j] = 0;
}
}
}

03 第二种解法

借用冒泡排序的思路,如果当前元素不等于0,就与前面的元素进行交换,这其中要借助一个变量指针来帮助我们完成交换的工作。

此解法的时间复杂度是O(n),空间复杂度是O(1)。

public void moveZeroes2(int[] nums) {
if (nums == null || nums.length == 0) {
return ;
}
int index = 0;
for(int i=0; i < nums.length; i++) {
if (nums[i] != 0) {
int temp = nums[index];
nums[index] = nums[i];
nums[i] = temp;
index++;
}
}
}

04 第三种解法

我们可以先将不等于0的元素放到数组的前面,这需要借助一个局部变量,一个从0开始的指针。然后再将剩下索引所对应的元素全部赋值为0。

此解法的时间复杂度是O(n),空间复杂度是O(1)。

public void moveZeroes3(int[] nums) {
if (nums == null || nums.length == 0) {
return ;
}
int index = 0;
for (int num : nums) {
if (num != 0) {
nums[index++] = num;
}
}
for (int i=index; i<nums.length; i++) {
nums[i] = 0;
}
}

05 小结

算法专题目前已连续日更超过一个月,算法题文章67+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode算法题-Move Zeroes(Java实现-三种解法)的更多相关文章

  1. LeetCode算法题-First Bad Version(Java实现-三种解法)

    这是悦乐书的第200次更新,第210篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第66题(顺位题号是278).您是产品经理,目前领导团队开发新产品.不幸的是,您产品的最 ...

  2. LeetCode算法题-Heaters(Java实现)

    这是悦乐书的第239次更新,第252篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第106题(顺位题号是475).冬天来了!您在比赛期间的第一份工作是设计一个固定温暖半径 ...

  3. LeetCode算法题-Sqrt(Java实现)

    这是悦乐书的第158次更新,第160篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第17题(顺位题号是69). 计算并返回x的平方根,其中x保证为非负整数. 由于返回类型 ...

  4. LeetCode算法题-Intersection of Two Linked Lists(Java实现)

    这是悦乐书的第178次更新,第180篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第37题(顺位题号是160).编写程序以找到两个单链表交叉的节点.例如: 以下两个链表: ...

  5. LeetCode算法题-Factorial Trailing Zeroes(Java实现)

    这是悦乐书的第183次更新,第185篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第42题(顺位题号是172).给定一个整数n,返回n!中的尾随零数.例如: 输入:3 输 ...

  6. LeetCode算法题-Subdomain Visit Count(Java实现)

    这是悦乐书的第320次更新,第341篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第189题(顺位题号是811).像"discuss.leetcode.com& ...

  7. LeetCode算法题-Number of Lines To Write String(Java实现)

    这是悦乐书的第319次更新,第340篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第188题(顺位题号是806).我们要将给定字符串S的字母从左到右写成行.每行最大宽度为 ...

  8. LeetCode算法题-Unique Morse Code Words(Java实现)

    这是悦乐书的第318次更新,第339篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第186题(顺位题号是804).国际莫尔斯电码定义了一种标准编码,其中每个字母映射到一系 ...

  9. LeetCode算法题-Rotate String(Java实现)

    这是悦乐书的第317次更新,第338篇原创 在开始今天的算法题前,说几句,今天是世界读书日,推荐两本书给大家,<终身成长>和<禅与摩托车维修艺术>,值得好好阅读和反复阅读. 0 ...

随机推荐

  1. Oracle 如何开启归档模式

    Oracle开启归档 场景:某所的数据库没有开启归档,如何开启归档模式的文档. 1.查看oracle归档状态 SQL> archive log list; 数据库日志模式 非存档模式 //目前不 ...

  2. c# EF code First生成数据库以及表

    1. 安装Entity Framework 使用NuGet安装Entity Framework程序包:工具->库程序包管理器->程序包管理器控制台,执行以下语句: PM> Insta ...

  3. HangFire循环作业中作业因执行时间太长未完成新作业开启导致重复数据的问题

    解决方法:在执行的任务方法前加上Mutex特性即可,如果作业未完成,新作业开启的话,新作业会放入计划中的作业队列中,直到前面的作业完成. 必须使用Hangfire.Pro.Redis 和 Hangfi ...

  4. Wpf学习20180605

    Windows Presentation Foundation 窗口展示框架 WPF. 与winform界面程序比较,我认为最大的区别是‘与分辨率无关’这个特性. 传统winform程序在低分辨率的电 ...

  5. VS2017 启动调试出现 无法启动程序“http://localhost:15613” 操作在当前状态中是非法的。 同时附加进程也是错误的解决方法

    第一次发表这样的博客,不会如何的排版,还有很多的不懂,大神勿喷哈! 同时是给自己做的一次记录,已方便后面可能会同样出现该问题后不用像无头苍蝇一样到处百度乱找 VS2017 启动调试出现  无法启动程序 ...

  6. Stackoverflow每日问题 系列前言

    都是程序员,想必都对stackoverflow有一定的了解,这个网站是世界上最为活跃的编程知识的论坛网站,上面活跃着数以万计的大神.提问各种有意义有价值的问题,还有这些问题的详细的回答. 但是毕竟是国 ...

  7. Java web.xml笔记

    Javaweb项目中, web.xml文件其中的各种设置, 就是简单的标注 <?xml version="1.0" encoding="UTF-8"?&g ...

  8. cf24D. Broken robot(高斯消元)

    题意 题目链接 Sol 今天上午的A题.想出来怎么做了但是没时间写了qwq 思路很简单,首先把转移方程列一下,发现每一个位置只会从下一行/左右转移过来,而且第N行都是0,那么往下转移的都可以回带. 剩 ...

  9. Django之django模型层二多表操作

    一 创建模型 表和表之间的关系 一对一.多对一.多对多 ,用book表和publish表自己来想想关系,想想里面的操作,加外键约束和不加外键约束的区别,一对一的外键约束是在一对多的约束上加上唯一约束. ...

  10. 如何用ABP框架快速完成项目(3) - 为什么要使用ABP和ABP框架简介

    首先先讲为什么要使用ABP? 当然是因为使用ABP可以快速完成项目啦. 时间就是金钱, 效率就是生命嘛   有了ABP, 你就节省了写如下模块的时间: CRUD数据库基本操作 校验 异常处理 日志 权 ...