老师,我电脑运行的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
数据量再大一些试试
032024-11-07
相似问题