代码随想录算法训练营第八天|leetcode344.反转字符串、leetcode541. 反转字符串II、卡码网54. 替换数字

1 leetcode344.反转字符串

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

文章链接:代码随想录

视频链接:字符串基础操作! | LeetCode:344.反转字符串_哔哩哔哩_bilibili

自己的思路:直接使用python的内置函数reverse进行一个操作

1.1 自己的代码

1.1.1 python的内置函数
class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        return s.reverse()
1.1.2 使用链表的方法
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

1.2 看文章后的思路

补充几种我目前没有想到的思路,但是我觉得也非常可行

1.2.1 切片的方法
class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        s[:] = s[::-1]
1.2.2使用循环
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]

1.3 本题小结

  1. 这种比较容易的题目,如果可以不用内置函数,尽可能的不要使用里面的内置函数,其实还有很多方法也可以解决
  2. 那就浅浅记录一下自己第一次同一道题用了两种方法啦

2 leetcode541. 反转字符串II

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

文章链接:代码随想录

视频链接:字符串操作进阶! | LeetCode:541. 反转字符串II_哔哩哔哩_bilibili

自己的思路:这道题是有思路,但是写的时候就很头疼,而且代码内的内容无法写通,有一种很乱的感觉,嗯,自己没写出来这道题

2.1 看视频后的思路

2.1.1 根据C++思路转换的代码

这道题和C++语法不一样的地方就是,字符串内部不能进行直接的反转操作,所以就需要先将其转换为一个列表,然后对列表2*k长度数据的前k个数据进行翻转

class Solution:
    def reverseStr(self, s: str, k: int) -> str:
        s_list = list(s)
        for i in range(0,len(s_list),2*k):
            if i+k<=len(s_list):
                s_list[i:i+k]= reversed(s_list[i:i+k])
            else:
                s_list[i:] = reversed(s_list[i:])
        return ''.join(s_list)
2.1.2 文章内代码的理解

虽然字符串内部不能直接进行一个迭代的操作,但是字符串对其进行一个切片,切片位置的返回是可以变换的,因此也可进行另一种编码

class Solution:
    def reverseStr(self, s: str, k: int) -> str:
        p = 0
        while p<len(s):
            p2 = p+k
            s = s[:p]+s[p:p2][::-1]+s[p2:len(s)]
            p +=2*k
        return s
2.1.3 反转封装成一个函数

这种方法挺巧妙的,将上一道题的代码进行一个函数的封装,然后调用,但是还是需要将字符串转换成列表的形式

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

2.3 本题小结

  1. 这道题的一个注意点就是在字符串中不能直接进行循环,需要将其先转换为列表的形式,在进行循环遍历
  2. 不必每次都是加一循环遍历,循环也可以是多种的形式

3 卡码网54. 替换数字

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

文章链接:替换数字 | 代码随想录

自己的思路:这道题想的就是循环遍历,判断其是不是数字,如果是的话我就进行一个列表中的替换,否则就是直接循环

3.1 代码思路

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

3.2 本题小结

  1. 字符串判断其是否为数字的方式是s[i].isdigitit()即可
  2. 感觉这一块的知识点相对而言要简单一点,做起来就顺利很多

4 今日小结

  1. python中的字符串是不能直接进行迭代替换的,这里今天第一次尝试的时候就报错了
  2. range函数在使用的过程中,其内部是(start,end,step)
  3. 字符串的题对我而言稍微熟悉一些,希望接下来学习也会让我越来越轻松吧
posted @ 2024-10-23 11:07  小方呀0524  阅读(2)  评论(0编辑  收藏  举报