代码随想录算法训练营Day7 | 344. 反转字符串,541. 反转字符串II,Kama54. 替换数字

目录

344. 反转字符串

541. 反转字符串II

Kama54. 替换数字


344. 反转字符串

题目链接:344. 反转字符串 - 力扣(LeetCode)

文章讲解:代码随想录

解题卡点:陷入链表的思维了

        双指针法,左右指针分别指向字符串的左端和右端,交换指针元素,指针向字符串中心移动。另外,使用range迭代会比使用while更快,因为while需要进行一次比较判断。

        Tips:什么时候使用库函数?

        如果题目关键部分直接用库函数就能解决,建议不使用库函数。如果库函数仅仅是解题过程中的一小部分,并且已经清楚这个库函数的内部实现原理的话,可以考虑使用库函数。

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 right >= left:
            s[left], s[right] = s[right], s[left] # 两端元素交换
            left += 1
            right -= 1

# 运行速度更快,每次迭代无需进行比较
class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        n = len(s)
        for i in range(n//2):
            s[i], s[n-i-1] = s[n-i-1], s[i] # 两端元素交换

    # 时间复杂度 O(n)
    # 空间复杂度 O(1)

541. 反转字符串II

题目链接:541. 反转字符串 II - 力扣(LeetCode)

文章讲解:代码随想录

解题卡点:被条件限制绕晕,字符串没法切片替换

        模拟题,注意使用range中的步长去找每次反转的下标,找到之后使用上一题的反转函数,反转后进行合并。使用切片进行替换会更方便。

        Tips:

        ①字符串不能进行切片替换,需要先将字符串转为列表;

        ②索引超出范围时会自动限制在范围内,对于列表[1, 2, 4],进行[1: 8]的索引时会自动变成[1:3],类似于[ : ]。

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

    # 时间复杂度 O(n)
    # 空间复杂度 O(1)

Kama54. 替换数字

题目链接:54. 替换数字(第八期模拟笔试)

文章讲解:替换数字 | 代码随想录

解题卡点:学习双指针思路

        python中字符串不能修改,需要额外的辅助空间,以进行判断与替换。

def main():
    s = list(input())
    for i in range(len(s)):
        if s[i].isdigit():
            s[i] = 'number'
    print(''.join(s))
    
if __name__ == '__main__':
    main()

# 时间复杂度 O(n)
# 空间复杂度 O(n)

        对于具有可修改字符串的其他语言,很多数组填充类的问题,其做法都是先预先给数组扩容带填充后的大小,然后在从后向前进行操作。这么做有两个好处:①不用申请新数组;②从后向前填充元素,避免了从前向后填充元素时,每次添加元素都要将添加元素之后的所有元素向后移动的问题。 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值