代码随想录算法训练营第八天| 344.反转字符串、541.反转字符串II、剑指Offer05.替换空格、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

541. 反转字符串II

思路

当需要固定规律一段一段去处理字符串的时候,要在for循环的表达式上做文章。

代码

class Solution:
    def reverse_substring(self, text):
        left, right = 0, len(text) - 1
        while left < right:
            text[left], text[right] = text[right], text[left]
            left += 1
            right -= 1
        return text

    def reverseStr(self, s: str, k: int) -> str:
        s_list = list(s)
        for i in range(0, len(s), 2*k):
            s_list[i : i + k] = self.reverse_substring(s_list[i : i + k])
        return ''.join(s_list)

剑指Offer 05.替换空格

思路

使用双指针法。(开始想到的是replace函数,看来Python提供的函数确实很多)
数组填充类的问题,都可以先预先给数组扩容到填充后的大小,然后在从后向前进行操作。这么做有两个好处:

  1. 不用申请新数组。
  2. 从后向前填充元素,避免了从前向后填充元素时,每次添加元素都要将添加元素之后的所有元素向后移动的问题。

代码

class Solution:
    def replaceSpace(self, s: str) -> str:
        s_list = list(s)
        counter = s.count(' ')
        s_list.extend([' '] * counter * 2)

        left, right = len(s) - 1, len(s_list) - 1
        while left >= 0:
            if s_list[left] == ' ':
                s_list[right - 2 : right + 1] = '%20'
                right -= 3
            else:
                s_list[right] = s_list[left]
                right -= 1
            left -= 1
        return ''.join(s_list)

151.翻转字符串里的单词

思路

依然是双指针法,只不过列表中字符变成了单词。

代码

class Solution:
    def reverseWords(self, s: str) -> str:
        # 将字符串拆分为单词,即转换成列表类型
        words = s.split()

        # 反转单词
        left, right = 0, len(words) - 1
        while left < right:
            words[left], words[right] = words[right], words[left]
            left += 1
            right -= 1

        # 将列表转换成字符串
        return " ".join(words)

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

思路

局部反转+整体反转可以达到左旋转且仅在本串上操作的目的。
具体步骤为:

  1. 反转区间为前n的子串
  2. 反转区间为n到末尾的子串
  3. 反转整个字符串

另外,reversed函数返回的是一个迭代器,需要转成列表或字符串。

代码

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)

每日总结

今天的题目双指针是个重要的思路,并且要想到巧妙的思路后代码并不复杂(但问题是想不到 😦 )。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值