关于javascript:移动零到数组末尾

起源:力扣(LeetCode)

给定一个数组 nums,编写一个函数将所有 0 挪动到数组的开端,同时放弃非零元素的绝对程序。

示例:

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

阐明:

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

办法一:快慢双指针

  • 快慢指针都从0开始
  • 当用快指针指向的值不为0时,与慢指针替换值
  • 慢指针负责指向值为0的元素

<img src=”https://pic2.zhimg.com/80/v2-b2d79135af42333c82dc342b14c7ec49_720w.png” alt=”img” style=”zoom:80%;” />

var moveZeroes = function(nums) {
    let n = nums.length;
    let slow = fast = 0
    while(fast < n) {
        if (nums[fast] !== 0) {
            [nums[slow], nums[fast]] = [nums[fast], nums[slow]]
            slow++
        }
        fast++
    }
    return nums
};
  • 工夫复杂度:O(n)
  • 空间复杂度:O(1)

办法二:

  • 变量j 负责记录非0元素的个数
  • 判断以后元素是否为0,不为0时,令下标为j的元素等于以后元素
  • 最初的后果是所有非0的数都往前挪动了,剩下的元素全副赋值0
var moveZeroes = function(nums) {
    let j = 0;
    for (let i = 0; i < nums.length; i++) {
        if (nums[i] != 0)
            nums[j++] = nums[i];
    }
    for (let i = j; i < nums.length; i++) {
        nums[i] = 0
    }
    return nums
};

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理