算法训练营第八日| LC344.反转字符串 LC541. 反转字符串II 剑指Offer 05.替换空格 LC151.翻转字符串里的单词 剑指Offer58-II.左旋转字符串

LC344.反转字符串:

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 left < right:
            s[left], s[right] = s[right], s[left]
            left += 1
            right -= 1

定义前后双指针,两个指针往中间走。互换指针的值就可以得到反转的字符串。

LC541. 反转字符串II:

class Solution:
    def reverseStr(self, s: str, k: int) -> str:
        def reverseSlides(slides):
            left, right = 0, len(slides) - 1
            while left < right:
                slides[left] ,slides[right] = slides[right], slides[left]
                left += 1
                right -= 1
            return slides

        res = list(s)

        for index in range(0, len(s), 2*k):
            res[index:index+k] = reverseSlides(res[index:index+k])
        
        return "".join(res)

使用range(start,end,step)来确定需要调换的位置,左闭右开[start,end).     " ".join (res)可以把数组转换为字符串

剑指Offer 05.替换空格:

class Solution:
    def replaceSpace(self, s: str) -> str:
        counter = s.count(" ")        #内置函数统计空格数量
        res = list(s)
        res.extend([' ']*2*counter)   #每碰到一个空格,就将字符串长度延长2格
        left = len(s) - 1
        right = len(res) - 1        #left指针指向原字符串末尾,right指向新字符串末尾
        
        while left >= 0:
            if res[left] != ' ':
                res[right] = res[left]
                left -= 1
                right -= 1
            else:
                res[right] = '0'
                res[right - 1] = '2'
                res[right - 2] = '%'
                right -= 3
                left -= 1
        return "".join(res)

如果遇到的不是空格,直接用left的元素替换right的数;如果遇到的是空格,那么把right指向的位置及往左边数的两个全部替换成“%“”2“”0“,然后right直接挪动三位,left挪动一位

LC 151 翻转字符串里的单词:

class Solution:
    def trim_space(self,s):
        n = len(s)
        left, right = 0, n - 1

        while left <= right and s[left] == " ":
            left += 1
        while left <= right and s[right] == " ":
            right -= 1
        s = s[left:right+1]
            
        fast, slow = 0 ,0
        while fast < len(s):
            if fast >= 1 and s[fast] == " " and s[fast - 1] == " ":
                fast += 1
            else:
                s[slow] = s[fast]
                slow += 1
                fast += 1
        return s[:slow]    #去除空格
        
    def reverseString(self, s, left, right):
        while left < right:
            s[left], s[right] = s[right], s[left]
            left += 1
            right -= 1
        return None       #反转字符数组

    def reverse_each_word(self, s): 
        start, end = 0, 0
        n = len(s)
        while start < n:
            while end < n and s[end] != " ":
                end += 1
            self.reverseString(s, start, end-1)
            start = end + 1
            end += 1
        return None     #反转每个单词
        
    def reverseWords(self, s):
        s = list(s)
        l = self.trim_space(s)
        self.reverseString(l, 0, len(l) - 1)
        self.reverse_each_word(l)
            
        return "".join(l)  #反转字符串里的单词

剑指Offer58-II.左旋转字符串:

class Solution:
    def reverseLeftWords(self, s: str, n: int) -> str:
        def reverse(s, left, right):
            while left < right:
                s[left], s[right] = s[right], s[left]
                left += 1
                right -= 1
        s = list(s)
        reverse(s, 0, n-1)       #反转前N个的字符子串
        reverse(s, n, len(s)-1)  #反转区间为N到末尾的字串
        reverse(s, 0, len(s)-1)  #反转整个字符串
        return "".join(s)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值