代码随想录刷题day8

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

  1. 344.反转字符串
    采用双指针,一个从前一个从后相互靠近
class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        left, right = 0, len(s) - 1
        
        # 该方法已经不需要判断奇偶数,经测试后时间空间复杂度比用 for i in range(right//2)更低
        # 推荐该写法,更加通俗易懂
        while left < right:
            s[left], s[right] = s[right], s[left]
            left += 1
            right -= 1
  1. 541.反转字符串II

题目: 反转字符串2

题解:

1)如果是一段一段进行跳跃的,可以每次循环多移动一些,不要拘泥于每次只循环1
2) 可以注意字符串和数组之间的转换

代码:

class Solution(object):
    def reverseStr(self, s, k):
        """
        :type s: str
        :type k: int
        :rtype: str
        """
        res = list(s)
        for i in range(0, len(res), 2 * k):
            if i + k <= len(res):
                res [i: i + k] = reversed(res[i: i+k])
            else:
                res[i: len(res)] = reversed(res[i:len(res)]) 

        return ''.join(res)
        
  1. 剑指Offer 05.替换空格

题目:替换空格

题解:

1)为了节省空间,直接在原数组上操作吧,在后面补充一些位置,从后往前覆盖。(因为从前往后的移动位数比较多)
2) 注意一些库函数的写法

代码:

class Solution(object):
    def replaceSpace(self, s):
        """
        :type s: str
        :rtype: str
        """
        res = list(s)
        counter = s.count(' ')###记住
        res.extend([' '] * counter * 2)###记住
        left = len(s) - 1
        right = len(res) - 1
        while left < right:
            if res[left] == ' ':
                res[ right - 2: right + 1] = '%20'###记住 字符数组直接和字符串去比较
                right -= 3

            else:
                res[right] = res[left]
                right -= 1
            
            left -= 1
        return ''.join(res)
  1. 151.翻转字符串里的单词

题目:翻转字符串里的单词

题解:

  1. 要清楚分为三个步骤:首先剔除空格;然后翻转整个字符串;最后翻转单词。
    2)可以借助库函数reversed, 前提是要明白这个函数如何实现(使用双指针,一个前一个后的互相交换即可)注意reversed函数的写法,输入输出都
    3)剔除空格使用到双指针,快指针去找待替换的值,慢指针去找新的位置。

代码:

class Solution(object):
    def reverseWords(self, s):
        """
        :type s: str
        :rtype: str
        """


        def deleteKongge (ss):
            slow = 0
            fast = 0
            while fast < len(ss):
                if ss[fast] != ' ' and slow != 0:#当每次遇到一个新的单词,都在它前面加一个空格
                    ss[slow] = ' '
                    slow += 1
                    
                while fast < len(ss) and ss[fast] != ' ':
                    ss[slow] = ss[fast]
                    slow += 1
                    fast += 1
                   
                fast += 1

            return ss[:slow]

      
        ss = list(s)
        res = deleteKongge(ss) #第一步
        
        res[:] = reversed(res[:])#第二步

        temp = 0
        for i in range(len(res)):#第三步
            if res[i] == ' ':
                res[temp : i] = reversed(res[temp : i])#从空格到之前的那个单词翻转
                temp = i + 1
        res[temp : ] = reversed(res[temp : ])#翻转最后一个单词

   
        return ''.join(res)
  1. 剑指Offer58-II.左旋转字符串

题目:左旋字符串

题解:

用了比较简单的方法,个人认为没必要搞复杂。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值