这是悦乐书的第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+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

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

最新文章

  1. python基础之day1
  2. C#设计模式系列:模板方法模式(Template Method)
  3. php统计网站访问次数的一个简单方法
  4. STM32F103ZET6 用定时器级联方式输出特定数目的PWM(转载)
  5. PayPal网站付款标准版(for PHP)
  6. 01线性表顺序存储_List--(线性表)
  7. ubuntu 100M 到 10M
  8. c#图像处理入门
  9. 重写equals()与hashCode()方法
  10. web报告工具FineReport在使用方法和解决方案常见错误遇到(一)
  11. Document Classification
  12. Charles Proxy代理使用简要说明
  13. 12 SharedPreferences
  14. 树莓派中QT实现PWM
  15. Java语言
  16. HNの野望
  17. Java连接MySQL数据库详细教程(附网盘下载地址)
  18. JavaWeb学习 (二十)————JavaWeb的两种开发模式
  19. WebService的一种简单应用方式入门
  20. mysql cmd 启动服务

热门文章

  1. IFS简单说明
  2. [转]docker基础详解
  3. Web部分_2
  4. Java多线程之wait、notify/notifyAll 详解,用wait 和notifyAll 以及synchronized实现阻塞队列,多线程拓展之ReentrantLock与Condition
  5. junit单元测试注意的问题
  6. SpringBoot+WebSocket
  7. Java 注解原理
  8. JavaScript有这几种测试分类
  9. 枚举getClass、getDeclaringClass区别
  10. C#DataTable复制、C#DataTable列复制、C#DataTable字段复制