前端算法- 移动零

749 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第41天,点击查看活动详情

题目

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]

思路一

我们这里直接使用循环,在循环中我们判断当前的形参nums的每一项是否等于0,如果等于0则使用splice方法对当前nums所在当前项的元素进行删除,然后再使用push方法将0添加到形参nums中

var moveZeroes = function (nums) {
    for (let i = 0 ; i<nums.length;i++) {
      if (nums[i]==0) {
        nums.splice(i, 1);
        nums.push(0);
      }
    }
}

思路二

我们这里可以使用双指针的方式进行实现,我们先创建两个变量,分别为left和right变量,默认值都为0,他们分别代表着左指针和右指针,left变量的值指向处理好的前半段数据的后一个,right变量指向未处理的数组最前面一个,然后我们进行循环,循环条件设定为如果当前的right变量小于当前形参的nums的数据长度则进入循环,在循环中我们进行判断当前形参nums的right变量位置是否不等于0,如果不等于0则进入循环,在循环中我们声明一个temp变量,默认值为形参nums数组的right变量位置值,我们用temp变量作为中介,将形参nums的left变量位置值和right变量位置值进行互换,最后将left变量进行自增1,无论形参nums的right变量位置值是否等于0,都将right变量进行自增1,直到right变量遍历完成

 var moveZeroes = function(nums) {
    let left=0,right=0
    while(right<nums.length){
        if(nums[right]!=0){
            let temp=nums[right]
            nums[right]=nums[left]
            nums[left]=temp
            left++
        }
        right++
    }
};