Day8. 字符串

本文详细介绍了如何在Python中实现字符串反转(包括344题和541题的解决方案)以及字符串的右旋转(55题),通过双指针法和切片技巧在O(1)空间内完成操作。
摘要由CSDN通过智能技术生成

344. 反转字符串 - 简单

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

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

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

思路:

1. 用双指针法,swap头和尾。头的index用0表示,尾的index用len(s)-1表示。

2. 在 while loop 条件下,swap头和尾时可以直接赋值转换。

3. 完成这一次后,头指针向后移动一位,尾指针向前移动一位,继续后面的swap。

541. 反转字符串II - 简单

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

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

方法一:

def reverseStr(self, s:str, k:int) -> str:
    p = 0
    for p < len(s):
        s = s[:p] + s[p:p+k][::-1] + s[p+k:]
        # 每2k个字符操作一次
        p = p + 2 * k
    return s
        

思路:

使用python的切片。

考虑到之后的循环,p之前的不动,s[:p]

p到p+k的部分,用s[p:p+k][::-1]倒序。

p+k之后的不动,s[p+k:]

p = p + 2*k,继续循环,达到每2k个操作一次的要求,p初始化为0。

知识点:

python的[::-1]的几种用法_python [::-1]-CSDN博客

 [start : end : step]

start:开始下标,从0开始

 end:结束下标,不包含该下标

 step:步长,步长为正时,从左向右取值。步长为负时,从右向左取值
 注意:步长不可以为0

方法二:

def reverseStr(self, s:str, k:int) -> str:
    def reverse_substring(text):
        left, right = 0, len(text)-1
        while left < right:
            text[left], text[right] = text[right], text[left]
            left += 1
            right -= 1 
        return text

    result = list()
    for i in range(0, len(s), 2*k):
        result[i:i+k] = reverse_substring(result[i:i+k])
    return ''.join(result)
            

思路:

先自定义基础函数reverse,即344答案

之后用for循环进行每2k个遍历,替换。

卡码网 54. 替换数字

class Solution:
    def change(self, s):
        # Python里面的string也是不可改的,所以也是需要额外空间的。空间复杂度:O(n)。
        lst = list(s) 
      
        for i in range(len(lst)):
            if lst[i].isdigit():
                lst[i]="number"
        return "".join(lst)

思路:先将 string转化成list,然后用for循环遍历判断每一个list中的元素,检查是否为数字,若是则可以用"number"顶替。有两个关键的函数的使用方式需要掌握。

知识点:

1. list() 可将字符串转换为列表

>>>test =list(cat)        >>>test        [c,a,t]

2. Python 中的 isdigit() 函数的用法:

判断单个字符是否为数字; 判断字符串中是否仅含有数字

151. 反转字符串中的单词

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

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

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

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

输入:s = "the sky is blue"
输出:"blue is sky the"
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)

用x.split将句子split成词,套用reverse函数,最后用“ ”.join()将words列表中的词连接成以空格为间隔的句子。

卡码网55:右旋字符串 

字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。

例如,对于输入字符串 "abcdefg" 和整数 2,函数应该将其转换为 "fgabcde"。

k = int(input())
s = input()

s = s[len(s)-k:] + s[:len(s)-k]
print(s)

思路:在len(s)-k处做切片,该index之前的用s[:len(s)-k]表示,该index之后的用s[len(s)-k:]表示

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值