>[success] # Leetcode -- 283 移动零
* 题目描述
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
**请注意** ,必须在不复制数组的情况下原地对数组进行操作。
* 示例 1:
~~~
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
~~~
* 示例 2:
~~~
输入: nums = [0]
输出: [0]
~~~
* 提示:
~~~
1 <= nums.length <= 104
-231 <= nums[i] <= 231 - 1
~~~
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/move-zeroes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
>[info] ## 用额外数组接收
**定义一个新数组长度和原数组一样**,并且数组初始**每个值都为0**,循环原数组找到一个**非0的值**将值从**新数组角标0开始插入**并加**1**,依次知道数组循环结束
![](https://img.kancloud.cn/5d/0e/5d0e56cffc9f1bf5fb778b88147be3db_1222x850.png)
![](https://img.kancloud.cn/d8/65/d865b9dcd873407c22ea38bc9f331607_648x426.png)
>[danger] ##### js 代码
~~~
/**
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
var moveZeroes = function (nums) {
const { length } = nums
// 生成一个接收
const newArray = new Array(length).fill(0)
// 循环旧数组 如果不是0 插入新数组
let i = 0
for (let key in nums) {
const val = nums[key]
if (val) {
newArray[i++] = val
}
}
nums.forEach((item,index)=>{
nums[index] = newArray[index]
})
}
~~~
>[danger] ##### java 代码
~~~
class Solution {
public void moveZeroes(int[] nums) {
// 获取当前数组长度
int len = nums.length;
// 创建一个新数组
int[] newArray = new int[len];
int idx= 0;
for(int i=0;i<len;i++){
if(nums[i] !=0){
newArray[idx++] = nums[i];
}
}
// 重新赋值
for(int i=0;i<len;i++){
nums[i] =newArray[i];
}
}
}
~~~
>[info] ## 双指针解法
利用**双指针**,双指针最开始位置都是**数组起始点**,**快指针**不受任何条件影响每次都会**自增1**,**慢指针**只有在**快指针**所处位置元素**不为0**时候才会前进,此时就会形成**快慢指针**,**落差位置**(形成后慢指针会一直指向0,只要和快指针位置元素交换,就可形成排序)
![](https://img.kancloud.cn/51/2d/512d042f966f31316c7ea1ac10e19917_928x854.png)
>[danger] ##### js 解法
~~~
var moveZeroes = function (nums) {
let fast = 0
let slow = 0
while(fast<nums.length){
// 只有当快指针不为0的时候慢指针才移动
if( nums[fast]!==0 ){
// 快慢指针在同一个元素时候不移动
if (slow != fast) {
;[nums[fast], nums[slow]] = [nums[slow], nums[fast]]
}
slow++
}
fast++
}
}
~~~
>[danger] ##### java
~~~
class Solution {
public void moveZeroes(int[] nums) {
// 创建快慢指针
int fast = 0;
int slow = 0;
int temp;
while(nums.length>fast){
// 慢指针只有在快指针不等于0时候才会移动
if(nums[fast] !=0){
// 形成快慢指针进行位置交换
if(fast!= slow){
temp = nums[fast];
nums[fast] = nums[slow];
nums[slow] = temp;
}
slow++;
}
fast++;
}
}
}
~~~
>[info] ## 双指针解法二
上面双指针中需要变量交换,交换的过程需要**创建第三方变量用来传递**,**变量创建会开辟内存空间**,如果交换的过程**忽略交换**,在最后慢**指针停留位置数据手动更改为0**
![](https://img.kancloud.cn/bf/96/bf96992d97e78e47cc6f888126c0db7e_1119x1676.png)
* 慢指针后要变0
![](https://img.kancloud.cn/91/2d/912df605eeea1bb8a920669d927db78a_1103x348.png)
>[danger] ##### js
~~~
/**
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
var moveZeroes = function(nums) {
// 声明快慢指针
let fast = 0
let slow = 0
while(nums.length>fast){
if(nums[fast]){
if(fast!=slow){
nums[slow] = nums[fast]
}
slow++
}
fast++
}
while(slow<nums.length){
nums[slow++] = 0
}
};
~~~
>[danger] ##### java
~~~
class Solution {
public void moveZeroes(int[] nums) {
// 快慢指针
int fast = 0;
int slow = 0;
int len = nums.length;
while(fast<len){
// 如果有值满指针移动
if(nums[fast]!=0){
nums[slow] = nums[fast];
slow++;
}
// 快指针移动
fast++;
}
// 将慢指针后面都归0
for(int i=slow;i<len;i++){
nums[i] = 0;
}
}
}
~~~
- 刷题准备
- 统计数组中元素出现次数
- Leetcode -- 442数组中重复的数据
- leetcode -- 448 找到所有数组中消失的数字
- 字符类似题
- Leetcode -- 1002 查找共用字符
- Leetcode -- 1370上升下降字符串
- 指针类题解
- Leetcode -- 283 移动零
- Leetcode -- 26. 删除有序数组中的重复项
- Leetcode -- 80. 删除有序数组中的重复项 II
- Leetcode -- 27. 移除元素
- Leetcode -- 344. 反转字符串
- Leetcode -- 125 验证回文串
- Leetcode -- 11 盛最多水的容器
- Leetcode -- 1480. 一维数组的动态和