80 - 移动零

题目

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

示例:

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

说明:

  1. 必须在原数组上操作,不能拷贝额外的数组。

  2. 尽量减少操作次数。

解答

要做两件事:

  • 把非零元素挪动到前面

  • 把后面的元素全部变成0

题解是保留了一个指针,记录最后的那个非零元素位置。

var moveZeroes = function (nums) {
  let last = 0
  for (let i = 0; i < nums.length; i++) {
    if (nums[i] != 0) {
      nums[last] = nums[i]
      last++
    }
  }
  for (let i = last; i < nums.length; i++) {
    nums[i] = 0
  }
};

Runtime: 60 ms, faster than 83.60% of JavaScript online submissions for Move Zeroes.

Memory Usage: 35.8 MB, less than 36.17% of JavaScript online submissions for Move Zeroes.

题解里面的做法:

nums[last++] = nums[i]

就相当于

nums[last] = nums[i]
last++

因为这个放在后面的++,是表达式结束后才+的。

不过感觉难以理解,就拿出来了。

func moveZeroes(nums []int) {
    last := 0
    for i := 0; i < len(nums); i++ {
        if nums[i] != 0 {
            nums[last] = nums[i]
            last++
        }
    }
    for i := last; i < len(nums); i++ {
        nums[i] = 0
    }
}

Runtime: 64 ms, faster than 77.91% of Go online submissions for Move Zeroes.

Memory Usage: 7.9 MB, less than 60.00% of Go online submissions for Move Zeroes.

一口气解决

还是双指针,如果不是0,就交换一下

我一开始想法也这样,咋就只能写出死循环呢😂😂

var moveZeroes = function (nums) {
  for (let last = 0, cur = 0; cur < nums.length; cur++) {
    if (nums[cur] != 0) {
      [nums[last], nums[cur]] = [nums[cur], nums[last]]
      last++
    }
  }
};

Runtime: 60 ms, faster than 83.60% of JavaScript online submissions for Move Zeroes.

Memory Usage: 36.5 MB, less than 8.51% of JavaScript online submissions for Move Zeroes.

func moveZeroes(nums []int) {
    last := 0
    for cur := 0; cur < len(nums); cur++ {
        if nums[cur] != 0 {
            nums[last], nums[cur] = nums[cur], nums[last]
            last++
        }
    }
}

Runtime: 60 ms, faster than 97.09% of Go online submissions for Move Zeroes.

Memory Usage: 7.7 MB, less than 100.00% of Go online submissions for Move Zeroes.

go好像没法在for里面定义两个变量😂

Last updated

Was this helpful?