算法合集 | 双指针 | Leetcode 344. 反转字符串

75 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第18天,点击查看活动详情

前言

本系列文章主要会总结一些常见的算法题目以及算法的易错点,难点,以及一些万用的公式,并且结合实际的 Leetcode 题目来进行加深理解以及实际应用,算法这种东西,属于是一到用时方恨少的类型,在平时总结一些常见的简单算法,经常磨练自己的算法思维,对于日常的开发还是能有不少的帮助的。

  • 今天还是来看一下双指针相关的知识以及题目

Leetcode 206. 反转链表

其实早在之前链表的相关题目当中,就已经使用过了双指针相关的知识,具体可以移步之前的链表相关题目,

在反转链表中,使用了双指针的方法。

那么反转字符串依然是使用双指针的方法,只不过对于字符串的反转,其实要比链表简单一些。

Leetcode 344. 反转字符串

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

解题

对于字符串,我们定义两个指针(也可以说是索引下标),一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素。

由于之前我们讲过,js的字符串是不可修改的,所以我们还是转换为数组修改然后再换回字符串。但是题目给出的数据就是将字符串分割为数组的数据了,所以就省去了这一步,直接进行转化就好了。

以字符串hello为例,过程如下:

image.png

然后左指针往右边,右指针往左边靠拢,并且在新的下标上重复交换的动作。

image.png

关于数组的交换,可以定义一个中间值来进行交换

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--;
    }
};

image.png