代码随想录训练营打卡第八天|344.反转字符串,541. 反转字符串II,剑指Offer 05.替换空格,151.翻转字符串里的单词,剑指Offer58-II.左旋转字符串

字符串|344.反转字符串,541. 反转字符串II,剑指Offer 05.替换空格,151.翻转字符串里的单词,剑指Offer58-II.左旋转字符串

文档链接:代码随想录
做题感悟:

  • 反转字符串:使用双指针,交换指针指向的字符。
  • 反转字符串II:不同之处在于,需要反转的字符串需要提前取出,这里只用切片取可以避免一些边界问题。切片越界会直接默认访问最末尾的元素。s[0:len(s)-1]对应的是[0,len(s)-1)的元素,切片是左闭右开。
  • 替换空格,重点是字符串要变成列表才能修改
  • 反转字符串里的单词,通过利用快慢指针覆盖剔除多余的空格,利用双指针实现对字符串的反转,同时借助另外一个双指针定位每个单词的首尾。
  • 左旋转字符串:先反转前半段,后反转后半段,最后整体反转。

题目一:344.反转字符串——15min

题目链接:题目
文档链接:文档
视频讲解:无

在这里插入图片描述

  • 使用双指针对字符串两端字符进行交换
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 right > left:
            temp = s[left]
            s[left] = s[right]
            s[right] = temp
            left += 1
            right -= 1
        return s

题目二:541.反转字符串II—40min

题目链接:题目
文档链接:文档
视频讲解:无

在这里插入图片描述

  • 首先字符串不是列表,不能索引,不可变类型。
  • 先将需要反转的字符串切出来,再进行反转。
  • 将列表转为字符串join(s)可以将s中的元素合并成字符串
class Solution:
    def reverseStr(self, s: str, k: int) -> str:
        # 先计算出双指针可能的起始位置
        # 再更新双指针位置,逐一进行反转

        s=list(s) #将字符串强制类型转换,字符串必须变成list才能索引
        L = len(s)
        n = L // (2*k)
        i = 0
       
        while i <= n:
            if L - 2*k*i >= k:# 先对前面的2k*n+k个字符进行处理
                left = 2*k*i
                right = 2*k*i+k-1  
            else:# 对剩下的字符进行处理
                left = 2*k*i
                right = L-1
            while left < right:
                    temp = s[left]
                    s[left] = s[right]
                    s[right] = temp
                    right -= 1
                    left += 1
            i += 1

        return ''.join(s) #字符串列表s连接成一个单独的字符串并返回 

'''
它使用了Python的内置函数join(),它可以将一个可迭代对象(如列表)中的元素用一个指定的分隔符连接成一个字符串。如果您不想要任何分隔符,您可以用空字符串’‘作为参数。例如,join(s)等价于’'.join(s)。
'''
  • 这里其实用切片更好,当切片访问越界时,默认访问到列表的最后一个元素,不会越界
class Solution:
    def reverseStr(self, s: str, k: int) -> str:
        """
        1. 使用range(start, end, step)来确定需要调换的初始位置
        2. 对于字符串s = 'abc',如果使用s[0:999] ===> 'abc'。字符串末尾如果超过最大长度,则会返回至字符串最后一个值,这个特性可以避免一些边界条件的处理。
        3. 用切片整体替换,而不是一个个替换.
        """
        def reverse_substring(text):
            left, right = 0, len(text) - 1
            while left < right:
                text[left], text[right] = text[right], text[left]
                left += 1
                right -= 1
            return text
        
        res = list(s)
        for cur in range(0, len(s), 2 * k):
            res[cur: cur + k] = reverse_substring(res[cur: cur + k])
        
        return ''.join(res)

题目三:剑指Offer 05.替换空格——15min

题目链接:题目
文档链接:文档
视频讲解:无

在这里插入图片描述

  • 字符串要转变成列表才能修改
  • 遍历查询空格并替换
class Solution:
    def replaceSpace(self, s: str) -> str:
        s=list(s) 
        res=[]
        for i in range(len(s)):
            if s[i]==' ':
                s[i]='%20'
            print(s[i])
        return ''.join(s)

题目四:151.翻转字符串里的单词——1h

题目链接:题目
文档链接:文档
视频讲解:视频

在这里插入图片描述

  • 首先使用快慢指针去除多余的空格元素。
  • 使用双指针实现对整个字符串的反转。
  • 使用while移动快慢指针,寻找每个单词,并调用reverse函数,实现对单词的二次翻转
class Solution:
    def delspace(self,s:str) -> str:
        # 使用快慢指针
        # 先遍历快指针
        # 现在单词前面空一个空格
        # 移动快慢指针将单词拷贝
        slow = 0
        fast = 0
        s = list(s)
        while fast < len(s):
            if s[fast] != ' ': # 只对非空格字符进行操作
                if slow != 0 and 0 < slow < len(s):# 首先判断是不是第一个单词,如果不是,则在前面空一格
                    s[slow] = ' '
                    slow += 1
                while fast < len(s) and s[fast] != ' ':# 将满足条件的单词拷贝过去,不满足条件的将会被覆盖
                    s[slow] = s[fast]
                    slow += 1
                    fast += 1 
            fast += 1
        return ''.join(s[0:slow])
    def reverse(self,nums:list) -> list:
        #用于反转
        left = 0
        right = len(nums)-1
        while left < right:
            temp = nums[left]
            nums[left] = nums[right]
            nums[right] = temp
            left += 1
            right -= 1
        return nums
 
    def reverseWords(self, s: str) -> str:
        s=list(self.delspace(s) )#先去掉多余空格
        print(s)
        nums= self.reverse(s)
        fast = 0
        slow = 0
        print(nums)
        while fast <= len(nums): # 移动快慢指针,反转每个单词的
            if fast == len(nums) or nums[fast] == ' ' : 
            # 如果第一个正确就不会执行第二个,and的话如果第一个错误也不会执行第二个
                print(nums[slow:fast])
                nums[slow:fast]=self.reverse(nums[slow:fast])
                slow=fast+1
            fast += 1
        return ''.join(nums)

题目五:剑指 Offer 58 - II. 左旋转字符串——20min

题目链接:题目
文档链接:文档
视频讲解:无

在这里插入图片描述

  • 先反转前半段
  • 再反转后半段
  • 最后整体在做一次反转
class Solution:
    def reverse(self,nums:list) -> list:
        right = len(nums)-1
        left = 0
        while left < right:
            nums[left],nums[right] = nums[right],nums[left]
            right -= 1
            left +=1
        return nums
    def reverseLeftWords(self, s: str, n: int) -> str:
        s=list(s)
        s[0:n] = self.reverse(s[0:n])
        s[n:len(s)] = self.reverse(s[n:len(s)])
        s=s[::-1]
        return ''.join(s)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值