思路
1、建立双指针,一个指最前的元素,一个指最后的元素。将它们两两交换
设长度是n,反转可以看成s[0] = s[n-1]
,top指针指向s[0]
,end指针指向s[n-1]
,交换完毕后,top指针++,end指针--,交换s[1]=s[n-2]
,依次推类。
结束循环的条件:
- 如果n是奇数,循环的条件为
top = end = n/2
- 如果n是偶数,最后交换的是
top=n/2 - 1, end = n/2
然后各自移动一位变成top = end+1 = n/2
偶数数组的情况
奇数数组的情况
综上所述,我们的循环条件可以设定为top>=end
复杂度分析:
- 时间复杂度:O(N),N为s的长度
- 空间复杂度:O(1),仅用到若干额外变量。
2、语法糖
s[::-1]
表示反转s中的元素s[:]
表示数组中所有子模块s[:]=s[::-1]
表示将原数组反转后赋值给s中每一个对应的位置s=s[::-1]
表示将s反转后赋值给新的对象s(可以通过id函数查看内存地址),与题意原地修改不符。
class Solution:
点击查看代码
class Solution:
def reverseString(self, s: List[str]) -> None:
# s[:] = s[::-1] 是切片赋值语法,表示用 s[::-1] 替换 s 中的元素。
# 注意不能写成 s = s[::-1],因为 s 只是一个局部变量,
# 对它的修改不会影响到函数外部传入的实际参数。
s[:] = s[::-1]
def reverseString(self, s: List[str]) -> None:
# s[:] = s[::-1] 是切片赋值语法,表示用 s[::-1] 替换 s 中的元素。
# 注意不能写成 s = s[::-1],因为 s 只是一个局部变量,
# 对它的修改不会影响到函数外部传入的实际参数。
s[:] = s[::-1]
标签:end,反转,top,字符串,指针,复杂度,赋值
From: https://www.cnblogs.com/codingsaveWorld/p/18035771