算法题解-零移动

157 阅读2分钟

题目

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

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

题解

第一种

我们先声明一个了变量index,我们用于记录当前零元素应该被移动到的位置,然后我们使用for循环遍历数组nums,遍历的变量为i,初始值为0,我们设置结束条件为i小于nums的数据长度,在循环中我们使用条件判断当前元素是否为零,如果不是零,则进入循环,循环条件为当前index变量小于i变量且nums数组中的index下标数据不等于0,我们这个循环的作用是找到下一个可用于交换的零元素的位置,在循环中我们将index递增,直到找到一个零元素的位置,如果index小于i则说明找到了一个零元素的位置,我们就将nums[index]赋值为nums[i],即将非零元素移动到零元素的位置,然后将nums[i]赋值为0,即将原来的非零元素位置设置为零,等到循环结束后,数组中的所有零元素都被移动到了数组的末尾,同时保持了非零元素的相对顺序不变的操作

var moveZeroes = function(nums) {
    let index = 0
    for (let i = 0; i < nums.length; i ++) {
        if (nums[i] !== 0) {
            while (index < i && nums[index] !== 0) {
                index ++
            }
            if (index < i) {
                nums[index] = nums[i]
                nums[i] = 0
            }
        }
    }
};

第二种

我们在函数中先声明一个常量length,它存储的是参数nums数组的长度,然后我们声明了一个变量slow并将其初始化为0,该变量将用于记录非零元素的位置,然后我们使用for循环遍历数组中的每个元素,循环变量fs从0开始,逐步增加,直到达到数组的长度length为止,在循环中,我们判断当前元素是否为零,如果不是零,则将当前元素nums[fs]赋值给nums[slow],并将slow的值增加1,以便下一次非零元素可以被放置在正确的位置,当循环结束后,所有非零元素都已经被移动到了数组的前面并且它们的相对顺序不变,然后我们使用while循环将剩余的位置填充为零,循环中我们将nums[slow]的值设置为0,并将slow的值增加1,以便下一次填充,最后,我们将nums数组返回出去即可

var moveZeroes = function(nums) {
    const length = nums.length
    let slow = 0
     for(let fs =0;fs<length;fs++){
         if(nums[fs]!==0){
             nums[slow] = nums[fs]
             slow++
         }
     }
    while(slow<length){
        nums[slow]=0
        slow++
    }
    return nums
};

坚持努力,无惧未来!