8. 移动零
时间:2021-06-12
本文章向大家介绍8. 移动零,主要包括8. 移动零使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
移动零
[原题链接](初级算法 - LeetBook - 力扣(LeetCode)全球极客挚爱的技术成长平台 (leetcode-cn.com))
/**
* 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
* 必须在原数组上操作,不能拷贝额外的数组。
* 尽量减少操作次数。
*/
public class Solution {
/**
* 法一:冒泡
* @param nums
*/
public void moveZeroes1(int[] nums) {
for (int i = 0, j = nums.length - 1; i < j; ) {
if (nums[i] == 0) bubbling(nums, i, j--);
else i++;
}
}
private void bubbling(int[] nums, int index, int des){
if (index == des) return;
int temp;
for (int i = index; i < des; i++) {
temp = nums[i];
nums[i] = nums[i + 1];
nums[i + 1] = temp;
}
}
/**
* 法二
* 思路:冒泡法改进,每次冒泡忽略0
*/
public void moveZeroes2(int[] nums) {
int temp;
for (int i = 0, j = i; i < nums.length - 1; j = ++i) {
while (nums[j] == 0){
if (++j == nums.length) return;
}
temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
/**
* 法三:
* 思路:从数组末端顺序找0,
* 找到则将0后的元素前移一位,并在数组最后补0
* 时间复杂度O(n^2)
* @param nums
*/
public void moveZeroes3(int[] nums) {
if (nums.length == 1) return;
for (int i = nums.length - 1; i >= 0; i--) {
//找到0
if (nums[i] == 0) {
//i后的元素前移
for (int j = i; j < nums.length - 1; j++) {
nums[j] = nums[j + 1];
}
//补0
nums[nums.length - 1] = 0;
}
}
}
/**
* 法四:
* 思路:用i、j遍历数组,i遇0则停
* 每当j遇到非0值,则j所在的元素(非0值)与i所在的元素(0)交换,
* 这样i就可以++了,循环这个过程,直到j“通过”数组,i必定到达了它所能到达的
* 最远的位置,i所到达的位置元素便非0了,且相对顺序不变。
* 这样数组的0值便移动到了数组末尾。
* 时间复杂度O(n)
* @param nums
*/
public void moveZeroes4(int[] nums){
//遇0则停
int i = 0;
int temp;
for (int j = 0; j < nums.length; j++) {
if (nums[j] != 0) {
temp = nums[j];
nums[j] = nums[i];
nums[i] = temp;
i++;
}
}
}
}
原文地址:https://www.cnblogs.com/getheading/p/14878638.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux使用Crontab定时访问某个路由地址的方法
- jmeter 在linux服务器的安装和运行教程图解
- Linux中改变文件权限的chmod命令详析
- Ubuntu常用指令及用法详解
- Linux 系统使用私钥登录的教程详解
- Ubuntu如何轻松编译openJDK详解
- 详解Linux下Tomcat开启查看GC信息
- Centos7.4 zabbix3.4.7源码安装的方法步骤
- CentOS7环境搭建python3以及与python2实现共存的方法
- centos7.0安装离线JDK1.8方法详解
- ubuntu中swap(虚拟内存)设置方法
- 详解Linux监控重要进程的实现方法
- CentOS环境下安装Redis3.0及phpredis扩展测试示例
- 使用Apache commons-cli包进行命令行参数解析的示例代码
- 详解如何在Ubuntu 16.04上增加Swap分区