引言

大家好啊,我是前端拿破轮😁。

跟着卡哥学算法有一段时间了,通过代码随想录的学习,受益匪浅,首先向卡哥致敬🫡。

但是在学习过程中我也发现了一些问题,很多当时理解了并且AC的题目过一段时间就又忘记了,或者不能完美的写出来。根据费曼学习法,光有输入的知识掌握的是不够牢靠的,所以我决定按照代码随想录的顺序,输出自己的刷题总结和思考。同时,由于以前学习过程使用的是JavaScript,而在2025年的今天,TypeScript几乎成了必备项,所以本专题内容也将使用TypeScript,来巩固自己的TypeScript语言能力。

题目信息

反转字符串

leetcode题目链接

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

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

题目分析

本题名叫反转字符串,实际上是反转字符串数组。说到这里,有一点大家一定要明确,在JavaScript和TypeScript中,字符串是不可变的。一旦声明了一个字符串,就不能修改其内容,只能给他重新赋值一个字符串。

反转数组的话,直接调用Array.prototype.reverse()就能实现本题的目标。但是很显然本体不是考查对API的熟悉程度。那么就要求我们不要使用API,用自己的方式来实现对数组的反转。

那这个应该我们都很熟悉了,直接使用双指针,分别从首尾向中间靠拢,并交换首位指针所指的元素。

题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
Do not return anything, modify s in-place instead.
*/
function reverseString(s: string[]): void {
// 双指针
let left = 0;
let right = s.length - 1;

// 开始交换
while (left < right) {
// 利用解构赋值交换
[s[left], s[right]] = [s[right], s[left]];

// 移动指针
left++;
right--;
}
};

时间复杂度:$O(n)$

空间复杂度:$O(1)$

总结

对于本题,考查数组的reverse()方法的底层实现方式,使用双指针遍可以轻松解决。在交换的过程中,通常做法是定义一个temp变量来进行临时保存和交换,但是利用解构赋值的语法,可以不用定义temp,直接一步到位。

好了,这篇文章就到这里啦,如果对您有所帮助,欢迎点赞,收藏,分享👍👍👍。您的认可是我更新的最大动力。由于笔者水平有限,难免有疏漏不足之处,欢迎各位大佬评论区指正。

往期推荐✨✨✨

我是前端拿破轮,关注我,一起学习前端知识,我们下期见!