leetcode-数组-283-移动零

283. 移动零

题目描述(难度:简单)

  • 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。说明:
  1. 必须在原数组上操作,不能拷贝额外的数组。
  2. 尽量减少操作次数。

示例:

Input: [0,1,0,3,12]
Output: [1,3,12,0,0]

解题思路

  • 逆向遍历:从数组最后开始遍历,遇到是0的元素,先删除这个0,再向数组最后补充0
  • 交换法:纪录 0 的数量,当遇见非 0,交换 0 于当前元素的位置
  • 前移法:建立新索引,当遇见非0,赋予当前元素值,索引增加,最后新索引之后的数组空间补充 0

代码

// 逆向遍历
var moveZeroes = function(nums) {
    for(let i=nums.length;i>=0;i--){
            if(nums[i] === 0){
                nums.splice(i,1);
                nums.push(0);
            }
    }
    return nums;
};

/**
 * 前移法
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var moveZeroes = function(nums) {
    let count = 0;
    for(let i = 0; i < nums.length; i++) {
        if (nums[i]) {
            // 非 0 元素,新索引赋予当前值,新索引累加
            nums[count++] = nums[i];
        }
    }
    // 新索引后补充 0
    while(count < nums.length) {
        nums[count++] = 0;
    } 
    return nums
};

/**
 * 交换法
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
const moveZeroes = function (nums) {
  let j = 0;
  let temp = '';
  for (let i = 0; i < nums.length; i++) {
    if (nums[i] !== 0) {
      temp = nums[j];
      nums[j] = nums[i];
      nums[i] = temp;
      j++;
    }
  }
};

   转载规则


《leetcode-数组-283-移动零》 朝飞 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
leetcode-数组-349-两个数组的交集 leetcode-数组-349-两个数组的交集
349. 两个数组的交集题目描述(难度:简单) 给定两个数组,编写一个函数来计算它们的交集。说明: 输出结果中的每个元素一定是唯一的。 我们可以不考虑输出结果的顺序。 示例1: Input: nums1 = [1,2,2,1], n
2020-05-25
下一篇 
leetcode-数组-股票买卖最佳时机合集 leetcode-数组-股票买卖最佳时机合集
121. 买卖股票的最佳时机题目描述(难度:简单) 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。 注意:你不能在买入股票
2020-05-23
  目录