代码随想录算法训练营第八天 |344.反转字符串、541. 反转字符串II、卡码网54. 替换数字、151.翻转字符串里的单词 、卡码网:55.右旋转字符串

文章详细介绍了Python中反转字符串的不同方法,包括基本的首尾交换、反转指定区间以及处理复杂条件下的字符串反转问题,如每2k个字符反转前k个。还涉及到了字符串的切片和遍历技巧。
摘要由CSDN通过智能技术生成

344.反转字符串

文档讲解:代码随想录

class Solution:
    def reverseString(self, s: List[str]) -> None:
        #首尾两两交换即可
        head = 0
        tail = len(s)-1
        while head < tail:#奇数偶数都可以这样判断,奇数停止交换的时刻就是head=tial,偶数停止交换的时刻就是head>tail
            s[head],s[tail] = s[tail],s[head]
            head = head + 1
            tail = tail -1
        return s

541. 反转字符串II

文档讲解:代码随想录

题目

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

如果剩余字符少于 k 个,则将剩余字符全部反转。

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

分析

题目中经常用到的一个功能就是反转字符串,所以我们先写一个函数来封装这一个功能

在Python中使用切片语法s[i:i+k]来获取列表、数组或字符串的一部分时,如果在指定的切片中剩余的元素不足k个,Python不会报错。它将简单地返回从索引i开始直到列表末尾的所有元素,即使这些元素的数量少于k个。

其实在遍历字符串的过程中,只要让 i += (2 * k),i 每次移动 2 * k 就可以了,然后判断是否需要有反转的区间。因为要找的也就是每2 * k 区间的起点,这样写,程序会高效很多。

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

class Solution:
    def reverseStr(self, s: str, k: int) -> str:
        def reverse(strlist):
            #反转字符串和上一个题的做法一样
            head = 0
            tail = len(strlist)-1
            while head < tail:
                strlist[head],strlist[tail] = strlist[tail],strlist[head]
                head = head + 1
                tail = tail -1
            return strlist
        s = list(s)
        #每计数至 2k 个字符,2k个字符的起始
        #这种写法包含了题目中所说的另外两种情况
        for i in range(0,len(s),2*k):
            #就反转这 2k 字符中的前 k 个字符
            s[i:i+k] = reverse(s[i:i+k])
        return "".join(s)

卡码网54. 替换数字

文档讲解:代码随想录

class Solution:
    def change(self, s):
        s = list(s)
        for i in range(len(s)):
            #检查一个字符是数字还是字母,如果是数字就更换
            if s[i].isdigit():
                s[i] = 'number'
        
        return ''.join(s)
   

151.翻转字符串里的单词 

文档讲解代码随想录

倒序遍历字符串 s ,记录单词左右索引边界 i , j 。
每确定一个单词的边界,则将其添加至单词列表 resresres 。
最终,将单词列表拼接为字符串,并返回即可

来源:力扣大佬 链接:https://leetcode.cn/problems/reverse-words-in-a-string/solutions/2361551/151-fan-zhuan-zi-fu-chuan-zhong-de-dan-c-yb1r/
 

class Solution:
    def reverseWords(self, s: str) -> str:
        s = list(s)
        i= len(s)-1
        j = len(s)-1
        res = []
        while i >=0:
            if s[i] == ' ': #跳过空格
                i = i -1
            else:
                j = i #单词的末尾索引
                while i >=0 and s[i] != ' ': #去找单词的首索引
                    i = i - 1
                
                # print(' '.join(s[i+1:j+1]))
                res.append(''.join(s[i+1:j+1])) #添加单词到res中
        return ' '.join(res)
                

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

文档讲解:代码随想录

先整体翻转,再对每部分进行翻转

def right_rotate(k, s):
    #定义翻转函数
    s = list(s)
    # print(s)
    def reverse(lists):
        left = 0
        right = len(lists)-1
        while left<right:
            lists[left],lists[right] = lists[right],lists[left]
            left = left + 1
            right = right -1
        return lists
    #先整体翻转
    reversed_s = reverse(list(s))
    #对两个部分分别翻转
    
    reversed_s[0:k] = reverse(reversed_s[0:k])
    
    reversed_s[k:len(reversed_s)] = reverse(reversed_s[k:len(reversed_s)])
    
    return  ''.join(reversed_s)       
        
# # 读取输入
k = int(input())
s = input()
# # 调用函数进行右旋转并输出结果
result = right_rotate(k, s)
print(result)

  • 19
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值