合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
>[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; } } } ~~~