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

一:LeetCode344.反转字符串 

        1:题目描述(344.反转字符串

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

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

        2:解题思路

        翻转字符串,实际上是将首尾对应的字符串进行交换,所以使用双指针法。

        定义两个指针left,right,分别指向字符串的起始位置和结束位置,然后将两个指针对应的元素值进行交换,再移动两个指针,直到right<left。

class Solution:
    def reverseString(self, s):
        """
        Do not return anything, modify s in-place instead.
        """
        left, right = 0, len(s)-1
        while left <= right:
            s[left], s[right] = s[right], s[left]
            right -= 1
            left += 1
        return s

二、LeetCode541. 反转字符串II

        1:题目描述(541. 反转字符串II

        给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

        如果剩余字符少于 k 个,则将剩余字符全部反转。
        如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

        2:解题思路

        本题针对 344.反转字符串  来说,多了一些规则。

        其中剩余的字符大于2k,或大于2k小于等于k时,翻转的字符串规则都是一样的,都是翻转范围内的前k个字符, 因此可以把这两种情况合并为一种情况;

        剩余的字符小于k,就需要将剩余的字符全部进行翻转,这是一种情况。

class Solution:
    def reverseStr(self, s, k):
        # 获取字符串的长度
        n = len(s)
        # 定义需要翻转的字符串的起始位置
        m = 0
        # 当需要翻转的起始位置大于等于字符串长度时,结束循环
        while m < n:
            # 剩余的字符大于2k,或大于2k小于等于k时,翻转的字符串规则都是一样的,都是翻转范围内的前k个字符
            # 因此可以把这两种情况合并
            # 剩余的字符数为:字符串长度-需要翻转的起始位置,即n-m
            if n-m >= k:
                # 字符串s需要分为三个部分
                # 第一部分:字符串的下标0到m(不包含m)的字符串,是已经翻转过的,所以不需要再进行翻转
                # 第二部分:字符串的下标m到k+m(不包含k+m)的字符串,是需要进行翻转的字符串,使用[::-1]进行翻转
                # 第三部分:字符串的下标k+m到n(不包含n)的字符串,是剩下的字符串串,不需要进行翻转
                s = s[:m] + s[m:k+m][::-1] + s[k+m:]
            # 剩余的字符小于k,就需要将剩余的字符全部进行翻转
            elif n-m < k:
                # 分为两部分
                # 第一部分:字符串的下标0到m(不包含m)的字符串,是已经翻转过的,所以不需要再进行翻转
                # 第二部分:字符串的下标m到n(不包含n)的字符串,是需要进行翻转的字符串,使用[::-1]进行翻转
                s = s[:m] + s[m:][::-1]
            # 翻转后,移动m的位置,每次移动2*k个位置
            m += 2*k
        return s

三、LeetCode151.翻转字符串里的单词

        1:题目描述(151.翻转字符串里的单词

        给你一个字符串 s ,请你反转字符串中 单词 的顺序。

        单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

        返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。

        注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

        2:解题思路

        第一步:先将字符串,以空格进行分割(使用split()函数),将单词分割出来,得到一个列表 

        第二步:然后对列表中的单词进行翻转

        第三步:再将翻转后的列表,通过join()函数,以空格进行连接成字符串

class Solution:
    def reverseWords(self, s):
        # 先将字符串切割成列表,使用split()不传参,默认以空格进行分割
        s_list = s.split()
        # 将列表中的元素进行翻转
        left = 0
        right = len(s_list)-1
        while left <= right:
            s_list[left], s_list[right] = s_list[right], s_list[left]   # 翻转元素
            left += 1
            right -= 1
        # 将翻转后的列表,通过join()函数,以空格连接成字符串
        res = " ".join(s_list)
        return res

四、剑指Offer 05.替换空格

        1:题目描述(剑指Offer 05.替换空格

        请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

        2:解题思路

        (1)可以直接使用replace()函数,把空格替换为“%20” 。

class Solution:
    def replaceSpace(self, s):
        s = s.replace(" ","%20")
        return s

        (2)可以把字符串转化为列表,然后遍历列表,判断遍历的值是否为空格,为空格,则将元素的值替换为“%20”,再将替换后的元素加到新的字符串中;不为空格,直接将元素添加到新的字符串。

class Solution:
    def replaceSpace(self, s):
        # 因为字符串是不可变类型,所以不能直接修改字符串中的某个字符
        # 先将字符串中的每个字符,放入列表,生成一个新列表
        # 定义一个新的字符串
        # 循环遍历新列表,当遍历的空格时,将元素替换为“%20”,并把替换后的元素加入到新的字符串中
        # 将不是空格的元素,直接加入新的字符串中
        # 最后返回新的字符串
        s_list = [s[i] for i in range(len(s))]
        res = ""
        for i in range(len(s_list)):
            if s_list[i] == " ":
                s_list[i] = "%20"
            res += s_list[i]
        return res

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

        1:题目描述(剑指Offer58-II.左旋转字符串

        字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。

        2:解题思路

        直接截取前n个字符, 添加到n到字符串最后一个字符的后面。

class Solution:
    def reverseLeftWords(self, s, n):
        s = s[n:] + s[:n]
        return s
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值