求star

开源不易,喜欢请点个star吧

Ocean Han
313 字
2 分钟
Leetcode->移动零
2022-07-22

题目#

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

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

示例 1:

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

示例 2:

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

提示:

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

解题:key:#

①双指针#

TIP

​ 指针slow记录0的位置,也就是说,slow的左边是非零序列,slow~fast之间的都是0

​ 指针fast每次找到第一个非零元素和slow交换

/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
	var moveZeroes = function (nums) {
	  // 记录 0 的位置
	  let slow = 0
	  // 不断向右移动,找到非 0 元素的位置
	  let fast = 0
	
	  while (fast < nums.length) {
	    if (nums[fast]) {
	      if (fast !== slow) {
	        [nums[slow], nums[fast]] = [nums[fast], nums[slow]]
	      }
	      slow++
	    }
	    fast++
	  }
	};

②使用一个新数组#

TIP

​ 由于题目要求需要原地对数组进行操作,所以这种方法仅作为一种思路

/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var moveZeroes = function (nums) {
    let newNums = []
    for (num of nums) {
        if(num !== 0){
            newNums.push(num)
        }
    }
    nums.fill(0)
    for(let i =0;i<newNums.length;i++){
        nums[i] = newNums[i]
    }
};
Leetcode->移动零
https://blog.oceanh.top/posts/algorithm/移动零/
作者
Ocean Han
发布于
2022-07-22
许可协议
CC BY-NC-SA 4.0
最后修改时间
2024-08-10 10:08:49