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

344.反转字符串

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
class Solution:
    def reverseString(self, s: List[str]) -> None:
        for i in range(len(s)//2):
            s[i],s[-i-1] = s[-i-1],s[i]

541. 反转字符串II

在遍历字符串的过程中,cur 每次移动 2 * k,用到range(start,end,step)

class Solution:
    def reverseStr(self, s: str, k: int) -> str:
        res = list(s)
        for cur in range(0,len(s),2*k):
            res[cur:cur+k] = reversed(res[cur:cur+k])
        return ''.join(res)
class Solution:
    def reverseStr(self, s: str, k: int) -> str:
        res = list(s)
        for i in range(0, len(s), 2 * k):
            l = i
            r = i + k - 1
            if r > len(s)-1:
                r = len(s)-1
            while l < r :
                res[l], res[r] = res[r], res[l]
                l += 1
                r -= 1
        res = "".join(res)
        return res

剑指Offer 05.替换空格

class Solution:
    def replaceSpace(self, s: str) -> str:
        counter = s.count(' ')
        res = list(s)

        # 每碰到一个空格就多拓展两个格子
        res.extend([' '] * counter * 2)
        # 原始字符串的末尾,拓展后的末尾
        left,right = len(s) - 1, len(res) - 1
        while left >= 0:
            if res[left] != ' ':
                res[right] = res[left]
                right -= 1
            else:
                res[right-2:right+1] ='%20'   # [right - 2, right), 左闭右开
                right -= 3
            left -= 1
        return ''.join(res)

151.翻转字符串里的单词

重点看复杂难度操作

class Solution:
  #1.去除多余的空格
        def trim_spaces(self, s):     
            n = len(s)
            left = 0
            right = n-1
        
            while left <= right and s[left] == ' ':    #去除开头的空格
                left += 1
            while left <= right and s[right] == ' ':   #去除结尾的空格
                right -= 1
            tmp = []
            while left <= right:                      #去除单词中间多余的空格
                if s[left] != ' ':
                    tmp.append(s[left])
                elif tmp[-1] != ' ':                 #当前位置是空格,但是相邻的上一个位置不是空格,则该空格是合理的
                    tmp.append(s[left])
                left += 1
            return tmp
	    
 #2.翻转字符数组
        def reverse_string(self, nums, left, right):
            while left < right:
                nums[left], nums[right] = nums[right], nums[left]
                left += 1
                right -= 1
            return None
	    
 #3.翻转每个单词
        def reverse_each_word(self, nums):
            start = 0
            end = 0
            n = len(nums)
            while start < n:
                while end < n and nums[end] != ' ':
                    end += 1
                self.reverse_string(nums, start, end-1)
                start = end + 1
                end += 1
            return None

#4.翻转字符串里的单词
        def reverseWords(self, s):                #测试用例:"the sky is blue"
            l = self.trim_spaces(s)               #输出:['t', 'h', 'e', ' ', 's', 'k', 'y', ' ', 'i', 's', ' ', 'b', 'l', 'u', 'e'
            self.reverse_string(l,  0, len(l)-1)  #输出:['e', 'u', 'l', 'b', ' ', 's', 'i', ' ', 'y', 'k', 's', ' ', 'e', 'h', 't']
            self.reverse_each_word(l)             #输出:['b', 'l', 'u', 'e', ' ', 'i', 's', ' ', 's', 'k', 'y', ' ', 't', 'h', 'e']
            return ''.join(l)                    #输出:blue is sky the

简单操作

class Solution:
    def reverseWords(self, s: str) -> str:
        s_list = [i for i in s.split(' ') if len(i) > 0]
        return ' '.join(s_list[::-1])

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

方法一

class Solution:
    def reverseLeftWords(self, s: str, n: int) -> str:
        return s[n:] + s[0:n]

方法二

class Solution:
    def reverseLeftWords(self, s: str, n: int) -> str:
        s = list(s)
        s[0:n] = list(reversed(s[0:n]))
        s[n:] = list(reversed(s[n:]))
        s.reverse()
        return ''.join(s)

方法三

class Solution:
    def reverseLeftWords(self, s: str, n: int) -> str:
        def reverse_sub(lst,left,right):
            while left < right:
                lst[left],lst[right] = lst[right],lst[left]
                left += 1
                right -= 1
            
        res = list(s)
        end = len(res) - 1
        reverse_sub(res,0,n-1)
        reverse_sub(res,n,end)
        reverse_sub(res,0,end)
        return ''.join(res)

 

       力扣

       力扣

       力扣

  • 自己看到题目的第一想法

       毫无头绪            

       

  • 看完代码随想录之后的想法 

       151.翻转字符串里的单词 的c++ 版本看懂了,自己的python操作语言不是很理解       

  • 自己实现过程中遇到哪些困难

          

  • 今日收获,记录一下自己的学习时长
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值