JS笔试题-移动零

241 阅读1分钟

题目

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾。

示例:

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

说明:

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

分析:

  • 双指针,左指针在头,右指针在尾
  • 左指针在为0时,与非0的右指针交换。然后右指针向左移动
  • 左指针向右移动
  • 如果右指针为0,则向左移动

代码:

/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var moveZeroes = function(nums) {
  let left = 0, right = nums.length - 1;
  if (n <= 1) {
    return;
  }
  while (left < right) {
    if (nums[left] == 0 && nums[right]) {
      nums[left] = nums[left] ^ nums[right];
      nums[right] = nums[left] ^ nums[right];
      nums[left] = nums[left] ^ nums[right];
      right--;
    }
    left++;

    if (nums[right] == 0) {
      right--;
    }
  }
};

变形题

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

示例:

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

说明:

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

分析:

  • 双指针,左右指针都在头
  • 快指针向前寻找非0元素,慢指针寻找0元素
  • 当快指针找到非0元素,即和慢指针交换

代码:

/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var moveZeroes = function(nums) {
  let left = 0, right = 0, n = nums.length;
  if (n <= 1) {
    return;
  }
  while (right < n && left < n) {
    if (right != left && nums[right] && nums[left] == 0) {
      nums[right] = nums[left] ^ nums[right];
      nums[left] = nums[left] ^ nums[right];
      nums[right] = nums[left] ^ nums[right];
      left++;
    }
    right++;

    if (nums[left]) {
      left++;
    }
  }
};