LeetCode 344. 反转字符串 | Python

344. 反转字符串


题目来源:力扣(LeetCode)https://leetcode-cn.com/problems/reverse-string

题目


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

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

你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。

示例 1:

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

示例 2:

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

解题思路


思路:双指针

如若单纯为了达到 反转字符串 的目的,对于 Python 而言,这道题直接调用内置函数 reverse() 就能够得到结果,但这并不是此题的本意。

先看看本题中的要求及限制。

要求:

  • 编写函数,将输入的字符串反转过来。其中给定的字符串以字符数组的形式给出。

限制:

  • 不能分配额外的空间,使用 O ( 1 ) O(1) O(1) 的空间,原地修改输入数组。

在这里,我们可以使用双指针的方法。两个指针中其中一个从左往右遍历,另外一个从右往左遍历,遍历的同时交换字符。

具体的做法如下:

  • 定义双指针 left、right。left 指向数组头部,right 指向数组尾部;
  • 交换字符,同时将 left 往右移动一个位置,将 right 往左移动一个位置;
  • 重复第二个步骤,直至 left、right 指针重合。

这里额外提下,在第二个步骤中,如若非严格需要交换,即是当遇到 left、right 指针指向的元素相同时,不进行交换只移动指针。

不过,下面的代码,严格按照位置交换。

class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        # 定义指针
        left = 0
        right = len(s) - 1
        # left、right 指针重合前,遍历数组,交换字符
        while left < right:
            # 交换字符
            s[left], s[right] = s[right], s[left]
            # 移动指针
            left += 1
            right -= 1
复杂度分析
  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 为字符数组的长度。其中交换了 n / 2 n/2 n/2 次。
  • 空间复杂度: O ( 1 ) O(1) O(1)。只使用了常数空间。

欢迎关注


公众号 【书所集录


如有错误,烦请指出,欢迎指点交流

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值