Leetcode 344. Reverse String
Write a function that reverses a string. The input string is given as an array of characters
char[]
.Do not allocate extra space for another array, you must do this by modifying the input array in-place with O(1) extra memory.
You may assume all the characters consist of printable ascii characters.
Example 1:
Input: ["h","e","l","l","o"] Output: ["o","l","l","e","h"]
Example 2:
Input: ["H","a","n","n","a","h"] Output: ["h","a","n","n","a","H"]
这道题充分暴露了自己知识的不足吧,我的心路历程大概是这样的。
一开始的代码:
s = s[::-1]
我发现了testcase 中的 output 是始终不变的, 发现它需要的是 in-place algorithm,就是不依赖额外的资源或者依赖少数的额外资源,仅依靠输出来覆盖输入的一种算法操作。那么leetcode 的平台的检测操作可能是,每次都读取那个地址的数据看是否正确。而我的代码是浅复制,直接将 s指针指向另一个地址,所以 output 会始终不变。
倘若使用另一种代码:
s[:] = s[::-1]
虽然可以得到正确答案,但是实际上s[::-1] 调用了python 内部的方法,需要 O(n) 的额外空间,分配存储空间和释放存储空间通常是缓慢的操作。
最终我更改的代码如下:
class Solution(object):
def reverseString(self, s):
"""
:type s: List[str]
:rtype: 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]
beat 88+%
如果用双指针的话:
class Solution(object):
def reverseString(self, s):
"""
:type s: List[str]
:rtype: None Do not return anything, modify s in-place instead.
"""
n = len(s)
l = 0
r = n-1
while l < r:
s[l], s[r] = s[r], s[l]
l += 1
r -= 1
速度啥的就没有区别。