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