LeetCode 算法入门 — 移动零

719 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

移动零

原题地址

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

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例 1:

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

示例 2:

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

思路分析

方法一

  1. 看到题目的第一反应就是将数组中非零的元素过滤出来,然后按照数组的长度补0;
  2. 说干就干,使用数组的 filter 方法,将非0的数组元素过滤出来,得到 arrNo
  3. 循环数组,将小于 arrNo 长度下标的元素赋值为对应 arrNo 的元素,剩下的都为0。

方法二

  1. 拓展使用数组的 sort 方法;
  2. 我们都知道数组的 sort 方法可以将数组按照某个方法进行排序;
  3. 那么也可以将数组按照b进行排序,b如果是0,返回-1,a在b的前方,b在a的后方,即可将0放到数组的最后。

AC 代码

方法一

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

结果:

  • 执行结果: 通过
  • 执行用时:88 ms, 在所有 JavaScript 提交中击败了71.67%的用户
  • 内存消耗:46 MB, 在所有 JavaScript 提交中击败了11.80%的用户
  • 通过测试用例:74 / 74

方法二

/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var moveZeroes = function(nums) {
    nums.sort((a, b) => b ? 0 : -1)
};

结果:

  • 执行结果: 通过
  • 执行用时:80 ms, 在所有 JavaScript 提交中击败了90.48%的用户
  • 内存消耗:45.2 MB, 在所有 JavaScript 提交中击败了56.61%的用户
  • 通过测试用例:74 / 74

END