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

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

 

示例 1:

输入:s = ["h","e","l","l","o"]
输出:["o","l","l","e","h"]

示例 2:

输入:s = ["H","a","n","n","a","h"]
输出:["h","a","n","n","a","H"]

 

提示:

  • 1 <= s.length <= 105
  • s[i] 都是 ASCII 码表中的可打印字符

解法

分析:两头互相交换即可

for循环版本

1
2
3
4
5
6
7
8
9
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-i-1] = s[n-i-1],s[i]
return s

while双指针版本

1
2
3
4
5
6
7
8
9
10
class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
left,right = 0,len(s)-1
while left < right:
s[left],s[right] = s[right],s[left]
left += 1
right -= 1

python特有写法by灵神

1
2
3
4
5
6
class Solution:
def reverseString(self, s: List[str]) -> None:
# s[:] = s[::-1] 是切片赋值语法,表示用 s[::-1] 替换 s 中的元素。
# 注意不能写成 s = s[::-1],因为 s 只是一个局部变量,
# 对它的修改不会影响到函数外部传入的实际参数。
s[:] = s[::-1]

拓展延伸

python中如何通过形参修改实参的结果
例1:数值类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def f1(a):
print("f1函数打印形参:",a)

def f2(a):
print("f2函数打印形参:",a)
a = 9999
print("修改后,f2函数打印形参:",a)

a = 123456
print("原始的实参:",a)
f1(a)
print("f1函数调用后的实参",a)
f2(a)
print("f2函数调用后的实参",a)

打印结果
1
2
3
4
5
6
原始的实参: 123456
f1函数打印形参: 123456
f1函数调用后的实参 123456
f2函数打印形参: 123456
修改后,f2函数打印形参: 9999
f2函数调用后的实参 123456

结论:如果是整数类型,则形参修改不了实参

例2:列表类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def f1(a):
print("f1函数打印形参:",a)

def f2(a):
print("f2函数打印形参:",a)
# 注:下面必须是a[:]形式,直接对a赋值没有用
a[:] = [4,5,6]
print("修改后,f2函数打印形参:",a)

a = [1,2,3]
print("原始的实参:",a)
f1(a)
print("f1函数调用后的实参",a)
f2(a)
print("f2函数调用后的实参",a)

打印结果
1
2
3
4
5
6
原始的实参: [1, 2, 3]
f1函数打印形参: [1, 2, 3]
f1函数调用后的实参 [1, 2, 3]
f2函数打印形参: [1, 2, 3]
修改后,f2函数打印形参: [4, 5, 6]
f2函数调用后的实参 [4, 5, 6]

结论:如果是list类型,则形参可以修改实参