//结束了忙碌的期末,终于有了一个月的冬假,赶紧利用这段时间集中精力把Leetcode刷起来!
1.Leetcode344 反转字符串(题解)
难度:⭐️
这道题目算是比较基础也是很简单的一道题目了,用双指针的方法可以轻松解决。时间复杂度O(N),空间复杂度O(1)。具体代码。
在反转链表中,使用了双指针的方法。
那么反转字符串依然是使用双指针的方法,只不过对于字符串的反转,其实要比链表简单一些。
因为字符串也是一种数组,所以元素在内存中是连续分布,这就决定了反转链表和反转字符串方式上还是有所差异的。
对于字符串,我们定义两个指针(也可以说是索引下标),一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素。
以字符串hello
为例,过程如下:
至于交换swap的实现,有三种方法:交换指针地址(本题不适用,因为要迭代)、交换数值(常用)、位运算。这里简单说一下位运算的实现:
Template<class T> void swap(T& x, T& y){
X^=y;
y^=x;
x^=y;
}
这里^是位异或运算符,A^A=0, 0^B=B。
最后提一下,本题仅需一行代码就能解决,即使用库函数reverse(s.begin(), s.end());然而这样做便失去了题目的精髓。本题就是让你自己实现一个reverse方法。
2.Leetcode541 反转字符串II(题解)
难度:⭐️⭐️
这道题算是在上一题的基础上,加了一下判断和操作条件,需要以2k为区间,反转前k区间的字符串。一共需要O(n/2k)次循环,每次循环时完成反转需要O(k),因此总时间复杂度为O(n/2k)*O(k)=O(n),空间复杂度为O(1)。
思路1:先定义一个变量来存储剩余元素个数,然后每次循环递减2k,同时对这个区间的前k个元素反转,最后循环结束后,判断一下剩余元素个数,如果小于k,只反转剩下的部分,反之反转前k个元素。具体代码。
思路2:直接以2k区间大小来循环遍历,然后在循环函数体内判断2k区间实际包含的元素数量,如果小于k,则只反转开始位置到结束位置的字符,否则反转整个k区间。具体代码。(这样写虽然不用在循环结束后额外判断,但循环内需要多判断一次,相比思路1有利有弊)
官方题解的