LeetCode-283. Move Zeroes

问题描述

Given an integer array nums, move all 0‘s to the end of it while maintaining the relative order of the non-zero elements.

Note that you must do this in-place without making a copy of the array.

Example 1:

1
2
Input: nums = [0,1,0,3,12]
Output: [1,3,12,0,0]

Constraints:

  • 1 <= nums.length <= 104
  • -231 <= nums[i] <= 231 - 1

解答

方法一:双指针
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/*
* @Description: 283. Move Zeroes
* @Author: libk
* @Github: https://github.com/libk
*/
/**
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
const moveZeroes = function (nums) {
let left = 0
let right = 0

while (right < nums.length) {
if (nums[right]) {
let temp = nums[right]
nums[right] = nums[left]
nums[left] = temp
left++
}
right++
}
}
方法二:双指针改进

既然要处理的数字是0,那就不必交换,直接覆盖,末尾补零即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/*
* @Description: 283. Move Zeroes
* @Author: libk
* @Github: https://github.com/libk
*/
/**
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
const moveZeroes2 = function (nums) {
let left = 0
let right = 0

while (right < nums.length) {
if (nums[right]) {
nums[left++] = nums[right]
}
right++
}
while (left < nums.length) {
nums[left++] = 0
}
}