代码链接:
思路与算法:双指针
对于长度为 N N N 的待被反转的字符数组,我们可以观察反转前后下标的变化,假设反转前字符数组为 s [ 0 ] s [ 1 ] s [ 2 ] . . . s [ N − 1 ] s[0] s[1] s[2] ... s[N - 1] s[0]s[1]s[2]...s[N−1],那么反转后字符数组为 s [ N − 1 ] s [ N − 2 ] . . . s [ 0 ] s[N - 1] s[N - 2] ... s[0] s[N−1]s[N−2]...s[0]。比较反转前后下标变化很容易得出 s [ i ] s[i] s[i] 的字符与 s [ N − 1 − i ] s[N - 1 - i] s[N−1−i] 的字符发生了交换的规律,因此我们可以得出如下双指针的解法:
1、将 left 指向字符数组首元素,right 指向字符数组尾元素。
2、当 left < right:
- 交换 s[left] 和 s[right];
- left 指针右移一位,即 left = left + 1;
- right 指针左移一位,即 right = right - 1。
3、当 left >= right,反转结束,返回字符数组即可。
复杂度分析
- 时间复杂度: O ( N ) O(N) O(N),其中 NN 为字符数组的长度。一共执行了 N / 2 N/2 N/2 次的交换。
- 空间复杂度: O ( 1 ) O(1) O(1)。只使用了常数空间来存放若干变量。
class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
# n = len(s)
# for i in range(n//2):
# s[i], s[n-1-i] = s[n-1-i], s[i]
# return s
begin, end = 0, len(s)-1
while begin <= end:
s[begin], s[end] = s[end], s[begin]
begin += 1
end -= 1
return s