YuArtian/blog

数组移零

YuArtian opened this issue · 0 comments

数组移零

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

示例:

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

说明:

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

解题:

function moveZeroToLast(arr) {
    let index = 0;
    for (let i = 0, length = arr.length; i < length; i++) {
        if (arr[i] === 0) {
            index++;
        } else if (index !== 0) {
            arr[i - index] = arr[i];
            arr[i] = 0;
        }
    }
    return arr;
}

算法时间复杂度 O(n) ,空间复杂度 O(1)

备注:

可能也会想到以下的解法:

function zeroMove(array) {
  let len = array.length;
  let j = 0;
  for(let i=0;i<len-j;i++){
    if(array[i]===0){
      array.push(0);
      array.splice(i,1);
      i --;
      j ++;
    }
  }
  return array;
}

但是 splice 会改变数组的索引自动向前进一位,从而导致错误。所以,在遍历数组的时候并不建议使用splice操作数组。