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

1)文章链接:

344.反转字符串

541.反转字符串II

剑指offer 05.替换空格

151.翻转字符串里的单词

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

2)视频链接:

字符串基础操作! | LeetCode:344.反转字符串_哔哩哔哩_bilibili

字符串操作进阶! | LeetCode:541. 反转字符串II_哔哩哔哩_bilibili

字符串复杂操作拿捏了! | LeetCode:151.翻转字符串里的单词_哔哩哔哩_bilibili

3)今日收获:a. 541题中的跨越2k进行循环  b.数组可以对连续的多个位置进行一次性赋值  c.字符串-双指针翻转/ [::-1]翻转

[344]反转字符串


1.题目链接:https://leetcode.cn/problems/reverse-string/

2.题目难度:Easy

3.主要思路:双指针

4.代码:

class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        l, r = 0, len(s)-1
        while l<r:
            s[l], s[r] = s[r], s[l]
            l+=1
            r-=1

[541]反转字符串II


1.题目链接:https://leetcode.cn/problems/reverse-string-ii/

2.题目难度:Easy

3.主要思路:a. 外层循环每次跨越2k个  b.如果长度大于字符串长度了,则把剩下的进行翻转  c.翻转字符串在python里面可以直接用[::-1]实现

4.代码:

class Solution:
    def reverseStr(self, s: str, k: int) -> str:
        for i in range(0,len(s),2*k):
            j = i+k
            if j<len(s):
                s = s[:i]+s[i:j][::-1]+s[j:]
            else:
                s = s[:i]+s[i:len(s)][::-1]
        return s

[剑指offer 05]替换空格


1.题目链接:​​​​​​​https://leetcode.cn/problems/ti-huan-kong-ge-lcof/

2.题目难度:Easy

3.主要思路:a.双指针, 一个从字符串的末尾开始遍历,一个从结果集末尾开始遍历 b.注意数组可以对连续的多个位置一次性赋值

4.代码:

class Solution:
    def replaceSpace(self, s: str) -> str:
        cntSapce = s.count(' ')
        res = list(s)
        res.extend([' ']*cntSapce*2)
        left, right = len(s)-1, len(res)-1
        while left>=0:
            if s[left]!=' ':
                res[right] = s[left]
                right-=1
                left-=1
            else:
                res[right-2:right+1] = '%20' # 数组可以这个对多个连续的位置进行赋值
                right-=3
                left-=1
        return ''.join(res)

[151]翻转字符串里的单词


1.题目链接:​​​​​​​https://leetcode.cn/problems/reverse-words-in-a-string/

2.题目难度:Medium

3.主要思路:删除多余的空格(生成了单个字母&空格组成的列表list)+翻转整个字符串列表+翻转列表中的每个单词+拼接

4.代码:

class Solution:
    # 删除多余的空格,并返回删除后的list数组
    def trimSpace(self, s):
        left, right = 0, len(s)-1
        # 删除两端的空格
        while left <= right and s[left]==' ':
            left+=1
        while left <= right and s[right]==' ':
            right-=1
        res = []
        # 删除中间多余的空格
        while left <= right:
            if s[left]!=' ':
                res.append(s[left])
            elif s[left]==' ' and left-1>=0 and s[left-1]!=' ':
                res.append(s[left])
            left +=1
        return res
    # 翻转list数组
    def reverse(self, l, left, right):
        while left <= right:
            l[left], l[right] = l[right], l[left]
            left+=1
            right-=1
        return l
    # 翻转数组中的每个单词
    def reverse_word(self, l):
        start = 0
        end = 0
        n = len(l)
        while start<n:
            while end<n and l[end]!=' ':
                end+=1
            l = self.reverse(l, start, end-1)
            start=end+1
            end+=1
        return l
    # 返回join后的结果
    def reverseWords(self, s):
        res = self.trimSpace(s)  # 拆成了一个个的元素,不是一个个的单词
        res = self.reverse(res, 0, len(res)-1)
        res = self.reverse_word(res)
        return ''.join(res)

[剑指offer58-II]左旋转字符串


1.题目链接:​​​​​​​https://leetcode.cn/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof/

2.题目难度:Easy

3.主要思路:三种方法:切片、遍历-数组+join、遍历-字符串

4.代码:

# 方法一:切片
class Solution:
    def reverseLeftWords(self, s: str, n: int) -> str:
        return s[n:]+s[:n]

# 方法二:数组
class Solution:
    def reverseLeftWords(self, s: str, n: int) -> str:
        res = []
        for i in range(n, len(s)):
            res.append(s[i])
        for j in range(n):
            res.append(s[j])
        return ''.join(res)

# 方法三:字符串
class Solution:
    def reverseLeftWords(self, s: str, n: int) -> str:
        res = ''
        for i in range(n, len(s)):
            res+=s[i]
        for j in range(n):
            res+=s[j]
        return res

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值