【刷题打卡】283. 移动零

89 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情

一、题目描述:

283. 移动零 - 力扣(LeetCode) (leetcode-cn.com)

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

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

示例 1:

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

示例 2:

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

  提示:

  • 1 <= nums.length <= 10^4
  • -2^31 <= nums[i] <= 2^31 - 1  

进阶:你能尽量减少完成的操作次数吗?

二、思路分析:

分析题目,可以发现 0 的作用只是作为一个符号标记, 因此没必要特别的保存0数据的信息。 首先设置俩个指针,分别指向数组首尾,(注:尾为数组长度,而不是数组最后一个数字的位置),遍历数组,移动首指针,当发现数组中

存在 0 元素时,将 0 后边的数据都向前位移一位,然后将尾指针向左移动一位,继续执行,直到完成对整个数组的遍历,而此时的尾指针所指

向的位置正是题目要求末尾0序列的开始, 此时从尾指针开始将剩余数组赋值为0,。(这也是尾指针= 数组长度的原因,如果不存在0的话, 没必要进行赋值处理)

三、AC 代码:

var moveZeroes = function(nums) {
  let right = nums.length;
  if(right <= 1) // 如果数组长度为0和1 直接结束循环;
    return;
  let left = 0, len = right; 
  for(let i = 0;i < right;i++) {
    if(nums[i] == 0) {
      for(let j = i + 1;j < right;j++) {
        nums[j - 1] = nums[j];
      }
      right--; 
      i--;// 避免存在连续0时,部分0会被忽略掉的情况
    }
  }
  for(let i = right;i < len;i++)
    nums[i] = 0;
};

范文参考

283. 移动零 - Python 统计左侧0的前缀和 然后一次位移到位 最后补零 - 移动零 - 力扣(LeetCode)

好理解的双指针(Python版) - 移动零 - 力扣(LeetCode)