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

344. Reverse String

双指针

首尾两个指针交换

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

Python reverse()

class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        s.reverse()
        

541. Reverse String II

这道题就是模拟

class Solution:
    def reverseStr(self, s: str, k: int) -> str:
        res = list(s)
        for i in range(0, len(res), 2*k):
            if i + k < len(res):
            # Reverse the first k characters for every 2k characters
            # If there are < 2k but >= k characters, reverse the first k characters
                res[i: i+k] = res[i: i+k][::-1]
            else:
                # If there are fewer than k characters left, reverse all of them
                res[i:] = res[i:][::-1]

        # return res
        return ''.join(res)
            

剑指 Offer 05. 替换空格

不额外申请空间的话,需要先扩充数组,再利用双指针

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

        left = len(s) - 1
        right = len(res) - 1

        while left >= 0:
            if res[left] != ' ':
                res[right] = res[left]
                right -= 1
            else:
                res[right-2: right+1] = '%20'
                right -= 3
            left -= 1

        return ''.join(res)


当然也可以直接调用replace方法。


151. Reverse Words in a String

直接使用API

class Solution:
    def reverseWords(self, s: str) -> str:
        s = s.split()[::-1]
        return ' '.join(s)

自行编写对应函数

  1. 去除多余空格
  2. 反转整个字符串
  3. 反转单个单词
class Solution:
    def trim_spaces(self, s: str) -> list:
        left, right = 0, len(s) - 1
        # 去掉字符串开头的空白字符
        while left <= right and s[left] == ' ':
            left += 1
        
        # 去掉字符串末尾的空白字符
        while left <= right and s[right] == ' ':
            right -= 1
        
        # 将字符串间多余的空白字符去除
        output = []
        while left <= right:
            if s[left] != ' ':
                output.append(s[left])
            elif output[-1] != ' ':
                output.append(s[left])
            left += 1
        
        return output
            
    def reverse(self, l: list, left: int, right: int) -> None:
        while left < right:
            l[left], l[right] = l[right], l[left]
            left, right = left + 1, right - 1
            
    def reverse_each_word(self, l: list) -> None:
        n = len(l)
        start = end = 0
        
        while start < n:
            # 循环至单词的末尾
            while end < n and l[end] != ' ':
                end += 1
            # 翻转单词
            self.reverse(l, start, end - 1)
            # 更新start,去找下一个单词
            start = end + 1
            end += 1
                
    def reverseWords(self, s: str) -> str:
        l = self.trim_spaces(s)
        
        # 翻转字符串
        self.reverse(l, 0, len(l) - 1)
        
        # 翻转每个单词
        self.reverse_each_word(l)
        
        return ''.join(l)


剑指 Offer 58 - II. 左旋转字符串

具体步骤为:

  1. 反转区间为前n的子串
  2. 反转区间为n到末尾的子串
  3. 反转整个字符串
class Solution:
    def reverseLeftWords(self, s: str, n: int) -> str:
        res = list(s)
        res[0: n] = res[0: n][::-1]
        res[n: len(res)] = res[n: len(res)][::-1]
        res = res[::-1]
        return ''.join(res)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值