开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第18天,点击查看活动详情
前言
本系列文章主要会总结一些常见的算法题目以及算法的易错点,难点,以及一些万用的公式,并且结合实际的 Leetcode 题目来进行加深理解以及实际应用,算法这种东西,属于是一到用时方恨少的类型,在平时总结一些常见的简单算法,经常磨练自己的算法思维,对于日常的开发还是能有不少的帮助的。
- 今天还是来看一下双指针相关的知识以及题目
Leetcode 206. 反转链表
其实早在之前链表的相关题目当中,就已经使用过了双指针相关的知识,具体可以移步之前的链表相关题目,
在反转链表中,使用了双指针的方法。
那么反转字符串依然是使用双指针的方法,只不过对于字符串的反转,其实要比链表简单一些。
Leetcode 344. 反转字符串
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
解题
对于字符串,我们定义两个指针(也可以说是索引下标),一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素。
由于之前我们讲过,js的字符串是不可修改的,所以我们还是转换为数组修改然后再换回字符串。但是题目给出的数据就是将字符串分割为数组的数据了,所以就省去了这一步,直接进行转化就好了。
以字符串hello为例,过程如下:
然后左指针往右边,右指针往左边靠拢,并且在新的下标上重复交换的动作。
关于数组的交换,可以定义一个中间值来进行交换
let t = a[1]
a[1] = a[2]
a[2] = t
这样就可以完成字符串的交换动作
/**
Do not return anything, modify s in-place instead.
*/
function reverseString(s: string[]): void {
let length = s.length;
let l = 0;
let r = length - 1;
while (l < r) {
let t = s[l];
s[l] = s[r];
s[r] = t;
l++;
r--;
}
};