2024/3/13--代码随想录算法训练营day8|344.反转字符串、541.反转字符串||、54.替换数字、151.翻转字符串里的单词、55.右旋转字符串

文章介绍了在Python中反转字符串的各种方法,包括双指针法、使用栈、切片以及处理字符串不可变性的注意事项。讲解了不同方法的时间和空间复杂度,以及str.reverse()和切片的区别。
摘要由CSDN通过智能技术生成

字符串不可变,列表可变;不能直接在字符串上修改,要先将字符串转换成列表
有疑问:
s[left], s[right] = s[right], s[left]为啥能直接赋值

344.翻转字符串【双指针法、使用栈,str.reverse()、切片】

力扣链接
在这里插入图片描述
在这里插入图片描述

【双指针法】 时间复杂度o(n2)   空间复杂度度数O(1class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        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]
            left += 1
            right -= 1
            
【使用栈:先进后出】
class Solution:
    def reverseString(self, s: List[str]) -> None:
        stack = []
        for char in s:
            stack.append(char)
        for i in range(len(s)):
            s[i] = stack.pop()
            
 【使用reverse】
 class Solution:
    def reverseString(self, s: List[str]) -> None:
        s[:] = reversed(s)    #或者是    s.reverse()
 【使用切片】   
 class Solution:
    def reverseString(self, s: List[str]) -> None:
        s[:] = s[::-1]
 【reverse和切片的差别】
 1.reverse只适用于list,就地修改原列表,不返回新的列表,其返回值是None
 2.切片适用于liststr,切片会创建并返回一个新的序列,原序列不会被修改,这对str特别有用
      

541.反转字符串||

力扣链接
在这里插入图片描述

方法一:
class Solution:
    def reverseStr(self, s: str, k: int) -> str:
        '''
        1.range(start,end,step)
        2.对于字符串s = 'abc',如果使用s[0:999] ===> 'abc'。
        字符串末尾如果超过最大长度,则会返回至字符串最后一个值,这个特性可以避免一些边界条件的处理。
        3.用切片替换整体,而不是一个个替换
        '''
        ss = list(s)
        for i in range(0,len(ss),2*k):
            ss[i:i+k] = ss[i:i+k][::-1]
        return "".join(ss)
【注意】刚开始的时候,我直接在str上操作 
str[i:i+k]= str[i:i+k][::-1]这个就是相当于修改str的一部分,但是str是不可变的

方法二:
class Solution:
    def reverseStr(self, s: str, k: int) -> str:
        # Two pointers. Another is inside the loop.
        p = 0
        while p < len(s):
            p2 = p + k
            # Written in this could be more pythonic.
            s = s[:p] + s[p: p2][::-1] + s[p2:]  #这里其实是创建了一个新的字符串
            p = p + 2 * k
        return s

卡码网:54.替换数字

添加链接描述
在这里插入图片描述

ss = input()
rec = ''
for i in ss:
    if ord('0')<=ord(i)<=ord('9'):
        rec += 'number'
    else:
        rec += i
print(rec)

151.翻转字符串里的单词

力扣链接
在这里插入图片描述

class Solution:
    def reverseWords(self, s: str) -> str:
        word = s.split()
        left ,right = 0,len(word)-1
        while left < right :
            word[left],word[right] = word[right],word[left]
            left += 1
            right -= 1
        return " ".join(word)  #一定要有空格,否则单词间无间断
        
class Solution:
    def reverseWords(self, s: str) -> str:
        s = s.strip()  # 删除前后空白
        s = s[::-1]    # 反转整个字符串
        # 将字符串拆分为单词,并反转每个单词
        s = ' '.join(word[::-1] for word in s.split())
        return s    
 【str.split()str.strip()区别:】
 str.split()把字符串按照默认空格,为分隔符,返回一个列表
 str.strip()默认移除str头尾的空白字符串,返回一个新的str

卡码网:55.右旋转字符串

力扣链接
在这里插入图片描述

#获取输入的数字k和字符串,!!!【注意k和s是分开获得,两次input()索求得到】
k = int(input())
s = input()

#通过切片反转第一段和第二段字符串
#注意:python中字符串是不可变的,所以也需要额外空间
s = s[len(s)-k:] + s[:len(s)-k]
print(s)
  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值