js + leetcode刷题:No.283 移动零

题目:

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

示例:

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

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

/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
// Solution One -- 计数移动位置 68ms 35.8mb
// 统计零的个数,当零的个数大于0且遇上不等于0的将之向前替换;最后替换结束,数组中还缺少count0个0,逆序替换为0
var moveZeroes0 = function(nums) {
    let len = nums.length
    if(len <= 1) return nums
    let index0 = nums.indexOf(0)
    if(index0 === -1) return nums
    let count0 = 1
    for(let i = index0 + 1; i < len; i++){
        if(nums[i] !== 0 && count0 > 0){
            nums[index0] = nums[i]
            index0++
        }else{
            count0 += 1
        }
    }
    if(count0 > 0){
        for(let i = len-1; count0 > 0; i--,count0--){
            nums[i] = 0
        }
    }
};

// Solution Two -- 双指针  68ms  35.8mb
var moveZeroes1 = function(nums) {
    let i = 0, j=0
    while(i < nums.length){
        if (nums[i] != 0){
            if (j < i){
                nums[j] = nums[i]
                nums[i] = 0
            }
            j++
        }
        i++
    }
    return nums
};

// 位位交换  64ms  36.5mb
var moveZeroes2 = function(nums) {
    let j = 0;
    for (let i = 0; i < nums.length; i++) {
      if (nums[i] != 0) {
        [nums[j], nums[i]] = [nums[i], nums[j]]; //swap交换
        j++;
      }
    }
};
发布了67 篇原创文章 · 获赞 8 · 访问量 6325

猜你喜欢

转载自blog.csdn.net/qq_34425377/article/details/105058724