一、双指针介绍
双指针,指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的。
二、双指针使用技巧
对撞指针
比如翻转字符串,在分别将双指针分别指向数组的开头和末尾,然后将其指向的元素进行交换,之后再将指针向前移动,继续交换,直到两个指针相遇。
例子如下
- 定义左右指针
left和right,left的值为0,right的值为长度减1 - 分别将两个指针
left和right指向数组的开头及末尾,然后将其指向的元素进行交换,再将指针向中间移动一步,继续交换,直到left和right两个指针相遇。 - 最后返回数组
arr
let left = 0, right = s.length - 1;
while(left <= right) {
let newNum = s[left]
s[left] = s[right]
s[right] = newNum
left++
right--
}
return s
}
快慢指针
快慢指针也都是定义两个指针,但是它与对撞指针是有区别的,对撞指针分别指向数组的开头和结尾,但是快慢指针都指向同一个方向。 快慢指针中会初始化一个快指针fast和慢指针slow,每当快指针fast移动时都要去进行判断,判断通过然后移动快指针fast。
题解思路:
- 定义快慢双指针
fast和slow,如果快指针遍历的数据不等于val时,慢指针向前移动一位, - 如果快指针
fast等于val时,则慢指针slow不动,然后继续移动快指针fast
let removeElement = function(nums, val) {
/**
* 快慢指针
*
* 定义快慢指针fast和slow,对快指针进行比较,如果快指针不等于val时
* 移动慢指针,并将快指针fast的参数赋值给慢指针slow,
* 如果快指针的参数等于val,那么就直接继续快指针加1
* 知道快指针移动到最后一位,结束运动
* */
let fast = 0, slow = 0, len = nums.length
while (fast < len) {
if(nums[fast] != val) {
nums[slow] = nums[fast]
slow++
fast++
} else {
fast++
}
}
return slow
}
以上是所有内容,欢迎点赞,收藏!!! 如有不足支持,请留言!!!感谢!!!