1.双指针
双指针:采用两个指针,对一个数组或者字符串进行遍历,包括同向的快慢指针和反向的对撞指针
2.对撞指针
i:左指针 0,j:右指针 lenght-1,当i>=j则代表指针对撞,这时应该终止,否则i++;j--进行下一轮迭代
实现代码:
let arr = new Array(10).fill(0).map((item,i)=>i+1) // [1,...,10]
let i=0, j=arr.length-1 // 左右指针
while(i<j){
[arr[i],arr[j]]=[arr[j],arr[i]]
i++
j--
}
console.log('对撞前的索引:',i--,j++)
3.快慢指针
i:慢指针 步进1,j:快指针 步进>=1且j>=i,终止条件看情况,一般为j<length或者arr[i]==arr[j]
实现代码:
// 原地数组去重(前提数组有序)
function f(arr){ // arr有序
if(arr.length==0) return arr
let i = 0
for(let j = 1;j<arr.length;j++){
if(arr[j]==[i]) arr.splice(j--,1)
else i++
}
return arr
}
// 或者
function f(arr){
if(arr.length==0) return arr
let i = 0
for(let j=1;j<arr.length;j++){
if(arr[j]!==arr[i]){
i++
arr[i] = arr[j]
}
}
arr.length = i+1 // arr.splice(i+1)
return arr
}