算法题——移动零

50 阅读1分钟

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例 1:

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

示例 2:

输入: nums = [0]
输出: [0]

使用双指针,把nums当作栈

var moveZeroes = function(nums) {
    let slow=0
    for(let fast =0;fast<nums.length;fast++){
        if(nums[fast]!==0){
            nums[slow]=nums[fast]
            slow++
        }
    }
    nums.fill(0,slow)
};
  • 使用fast遍历数组所有元素,slow指向放非零元素的位置。

  • 当遍历完后,slow 之后的位置全部填 0

双指针+交换元素

使用方案一,最坏情况的时间复杂度还是 O(2n) ≈ O(n),也可以用原地交换的方式:

  • 只用一个循环,遇到非零元素时,直接和 slow 位置交换,然后 slow++
  • 不需要额外的 fill
var moveZeroes = function(nums) {
    let slow=0
    for(let fast =0;fast<nums.length;fast++){
        if(nums[fast]!==0){
            [nums[slow],nums[fast]]=[nums[fast],nums[slow]]
        }
    }
};

move_zeroes_pointers_blocks.gif