Leetcode 344 - 反转字符串
题目描述
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 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”]
思路
相向指针:一个指针在起点,一个指针在终点
两端同时往内收,步长一致,直到两者错过(左大于右),则遍历结束
初始化
左指针为起点0,有指针为终点len(s)-1
循环条件
当两者相遇后终止循环,如果两者索引相同的时候(数组长度为奇数),该元素可以不进入循环进行交换,所以while可以不包括等号
包括等号也可以,相当于中间元素与自己完成了一次交换
代码
Python
class Solution(object):
def reverseString(self, s):
"""
:type s: List[str]
:rtype: None Do not return anything, modify s in-place instead.
"""
left = 0
right = len(s) - 1
while left < right:
i = s[left]
s[left] = s[right]
s[right] = i
left += 1
right -= 1
return s
复杂度分析
时间复杂度: O(n) (while单循环,单循环内都是常数时间的操作)
空间复杂度: O(1) (在原数组修改,没有其余新的数组空间产生)
易错点
- 是在原数组进行修改,只需要返回k,不需要返回一个新数组,自己创建新数组不符合要求。
while的边界条件可以不包括等号,也可以包括,因为可以自己与自己交换,即nums[i] = nums[i]
收获
- 反转,即暗示可以用同向指针,因为是在原数组上修改,只能交换元素,在不开辟新数组的情况下理应考虑双指针
