老师,我电脑运行的split方法速度和双指针速度几乎差不多,有时候都会更快,是js对split方法进行优化了吗

来源:3-9 移动 0 到数组的末尾-使用双指针

慕桂英0428041

2024-11-05

// splitf方法
export function moveZeros(numsArr: number[]): void {
  const lenth = numsArr.length
  if (lenth === 0) {
    return
  }
  let zeroLength = 0
  for (let index = 0; index < lenth - zeroLength; index++) {
    const element = numsArr[index];
    if (element === 0) {
      numsArr.splice(index, 1)
      numsArr.push(0)
      index--
      zeroLength++
    }
  }
}
// push方法
export function moveZeros2(numsArr: number[]): void {
  const lenth = numsArr.length
  if (lenth === 0) {
    return
  }
  let zeroLength = 0
  for (let index = 0; index < lenth; index++) {
    const element = numsArr[index];
    if (element === 0) {
      zeroLength++
    } else {
      // 找到所有非0,push到数组末尾
      numsArr.push(element)
    }
  }
  numsArr.splice(0, lenth)
  // 在后面补齐0
  for (let index = 0; index < zeroLength; index++) {
    numsArr.push(0)
  }
}
// 双指针方法
export function moveZeros3(numsArr: number[]): void {
  const lenth = numsArr.length
  if (lenth === 0) {
    return
  }
  let i;
  let j = -1
  for (i = 0; i < numsArr.length; i++) {
    const element = numsArr[i];
    if (element === 0) {
      if (j < 0) {
        j = i
      }
    }
    if (element !== 0 && j >= 0) {
      numsArr[i] = numsArr[j]
      numsArr[j] = element
      j++
    }
  }
}



let arr = []
for (let index = 0; index < 500000; index++) {
  // arr.push(0)
  if (1 % 10 === 0) {
    arr.push(0)
  } else  {
    arr.push(1)
  }
}

console.time('方法1')
moveZeros(arr)
console.timeEnd('方法1')

console.time('方法2')
moveZeros2(arr)
console.timeEnd('方法2')

console.time('方法3')
moveZeros3(arr)
console.timeEnd('方法3')

图片描述

写回答

1回答

双越

2024-11-07

数据量再大一些试试

0
3
双越
回复
慕桂英0428041
对,这个数量级是一样的。看来是 JS 引擎内部做了一些优化。
2024-11-07
共3条回复

2周刷完100道前端优质面试真题 双越最新力作

『前端面试真题100道』视频详解

1509 学习 · 642 问题

查看课程