初级算法-数组章节-移动零

286 阅读1分钟

初级算法(第八题)

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

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

示例1:

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

说明

  1. 必须在原数组上操作,不能拷贝额外的数组。
  2. 尽量减少操作次数。

解题思路

  1. 首先题目要求是将所有的零放到数组后面去,其他不为零的元素再前面,并且不能破坏原有顺序
  2. 那么我们就有两种思路,第一种究是把不为零的往前移动,第二种就是把0都扔到数组末尾去。显然还是第一种比较简便快捷。
  3. 本题采用的是双指针,然后我写了两种方法。第一种是把不为零的全部移到前面后面的全部用0覆盖掉,第二种是通过两两对比然后移形换位

话不多说上代码

第一种解法:

/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var moveZeroes = function(nums) {
    let index = 0;
    for(let i = 0; i< nums.length; i++){
        if(nums[i] !== 0){
            nums[index++] = nums[i];
        }
    }
    while(index < nums.length){
        nums[index++] = 0;
    }
    return nums;
};

第二种解法

/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var moveZeroes = function(nums) {
    let left = 0;
    let right = 1;
    for(right; right < nums.length; right ++ ){
        if(nums[left] === 0 && nums[right] !== 0){
            let middle = nums[left];
            nums[left] = nums[right];
            nums[right] = middle;
        }
        if(nums[left] !== 0){
            left++
        }
    }
    return nums;
};

每天进步一点,理想终将实现。

祝大家前程似锦