持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情
关于算法系列已更新部分文章,后续会陆续增加内容:
【1】 算法之用动态规划实现斐波那契数列
【2】 算法之双指针法的应用
【3】 算法之链表的含义
双指针法
双指针并不是指真正的指针,而是一种比较形象的描述方式。常用于数组、字符串和链表的操作中,它更多情况下是用来表示下标。
双指针也称为快慢指针,在有些题目背景下,指针会有快慢之分,形成一定的下标差。
指针的位置根据不同的题目可能会出现在左侧、右侧、或者两端,具体情况要具体分析。
应用场景
- 删除有序数组的重复项
- 有序数组的平方
- 移除元素
- 替换空格
- 反转字符串
- ......
双指针法可以解决的问题大致分为两种类型:
- 删除或者覆盖元素
- 交换元素位置
双指针法应用——反转字符串
实现反转字符串的方式不止一种,在这里使用双指针法来实现
题目描述: 编写一个函数,将输入的字符串反转过来。( 注:不分配额外的空间,使用 O(1) 的空间复杂度来实现这一问题)
输入: s = ["h","e","l","l","o"]
输出: ["o","l","l","e","h"]
力扣题目链接: 反转字符串
思路: 在字符串的左右两端分别设定指针,循环的过程中不断交换两端元素,并进行i++、j--,直到i>=j停止交换。
注意 while 循环的范围是 i<j,因为无论数组元素的个数是奇数还是偶数,i 和 j 会一直保持一种小于的关系,直到条件不成立,循环停止。
元素交换:
数组元素交换的方法:
- [a,b] = [b,a]
- temp = a; a = b; b = a;
代码实现:
var reverseString = function(s) {
let i = 0,j = s.length - 1,temp;
while(i<j){
//temp = s[i];
//s[i] = s[j];
//s[j] = temp;
[s[i], s[j]] = [s[j], s[i]] // 数组元素交换
i++;
j--;
}
return s;
};