题目
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
示例
题解一
class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
# 这个操作的效率比较低,因为它涉及到了两个步骤:首先生成了一个反转后的列表 s[::-1],然后将这个反转后的列表赋值给原始列表 s[:]
# 在Python中,s[:]是一个切片操作,它表示对列表s进行整体切片,相当于创建了一个s的副本。因此,s[:]表示整个列表s的一个浅拷贝。
s[:]=s[::-1]
对于上面代码的几点疑问,不一定关于本次话题,而是一些知识点的补充
1、为什么不使用s=s[::-1],而是s[:]=s[::-1]?
首先,s只是对象的引用,s=s[::-1]使s指向了新的对象,并没有修改原对象。而s[:]是切片操作,s[:] 实际上是获取了 s 列表的一个"引用"时,这个引用指的是 s 列表中元素的引用,而不是 s 列表对象本身的引用,因此这个赋值操作更改的元素本身。
可以看个例子:
a = [1, 2, 3]
b = a # b引用了a所指向的对象
b[0] = 100 # 修改了b所引用的对象
print(a) # 输出 [100, 2, 3],原始对象也被修改了
b = [4, 5, 6] # 现在b指向了一个新的对象
print(a) # 输出 [100, 2, 3],原始对象不受影响
题解二
class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
# 双指针写法
left=0
right=len(s)-1
while left<right:
# 下面三行也可以简化为:s[left],s[right]=s[right],s[left],这个会同时执行交换
tmp=s[left]
s[left]=s[right]
s[right]=tmp
left+=1
right-=1