js将数组中的0移动到末尾

将数组中的0移动到末尾

  • 只移动0,其他顺序不变
  • 必须在原数组上操作
// 嵌套循环O(n^2)
function moveZero(arr){
    
    
  const length = arr.length
  if(length === 0) return

  let zeroLength = 0
  for(let i=0;i<length-zeroLength;i++){
    
    
    if(arr[i] === 0){
    
    
      arr.push(0)
      arr.splice(i,1) //O(n)
      i-- // 截取了一个数,要进行i++
      zeroLength++ // 最后0的个数,就不要遍历了
    }
  }
}

let arr = [1,0,0,2]
moveZero(arr)
console.log(arr);

双指针

  • 定义j指向第一个0,i指向j后面的第一个非0
  • 交换i和j的值,继续向后移动
  • 只遍历一次,复杂度为O(n)
// 双指针
function moveZero(arr){
    
    
  const length = arr.length
  if(length === 0) return

  let i // 指向第一个非0
  let j = -1 // 指向第一个0
  for(i=0;i<length;i++){
    
    
    if(arr[i]===0){
    
    
      // 第一个0赋值给j
      if(j<0){
    
    
        j = i
      }
    }
    if(arr[i]!==0&&j>=0){
    
    
      // 交换
      const n =arr[i]
      arr[i] = arr[j]
      arr[j] = n
      j++
    }
  }
}

如果可以不在原数组操作

// 如果可以不在原数组操作
function moveZero(arr){
    
    
  const part1 = []
  const part2 = []

  for(i=0;i<arr.length;i++){
    
    
    if(arr[i] === 0){
    
    
      part2.push(0)
    }else{
    
    
      part1.push(arr[i])
    }
  }
  return arr = [...part1,...part2]
}

猜你喜欢

转载自blog.csdn.net/qq_47234456/article/details/124936910