代码随想录算法训练营第八天|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 本题小结
- 这种比较容易的题目,如果可以不用内置函数,尽可能的不要使用里面的内置函数,其实还有很多方法也可以解决
- 那就浅浅记录一下自己第一次同一道题用了两种方法啦
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 本题小结
- 这道题的一个注意点就是在字符串中不能直接进行循环,需要将其先转换为列表的形式,在进行循环遍历
- 不必每次都是加一循环遍历,循环也可以是多种的形式
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 本题小结
- 字符串判断其是否为数字的方式是
s[i].isdigitit()
即可 - 感觉这一块的知识点相对而言要简单一点,做起来就顺利很多
4 今日小结
- python中的字符串是不能直接进行迭代替换的,这里今天第一次尝试的时候就报错了
range
函数在使用的过程中,其内部是(start,end,step)
- 字符串的题对我而言稍微熟悉一些,希望接下来学习也会让我越来越轻松吧