代码随想录算法训练营第一天|数组理论基础,704. 二分查找,27. 移除元素
代码随想录算法训练营第二天|977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II
代码随想录算法训练营第三天|链表理论基础,203.移除链表元素,707.设计链表,206.反转链表
代码随想录算法训练营第四天|24. 两两交换链表中的节点,19.删除链表的倒数第N个节点,面试题 02.07. 链表相交,142.环形链表II,总结
代码随想录算法训练营第五天|哈希表理论基础,242.有效的字母异位词,349. 两个数组的交集,202. 快乐数,1. 两数之和
代码随想录算法训练营第六天|454.四数相加II,383. 赎金信,15. 三数之和,18. 四数之和,总结
题目链接: 344.反转字符串
**题目内容:**编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
视频讲解:字符串基础操作! | LeetCode:344.反转字符串
核心思想:双指针法
class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
left,right=0,len(s)-1
while left < right:
s[left],s[right]=s[right],s[left]
left+=1
right-=1
return s
题目链接: 541.反转字符串
题目内容: 给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。如果剩余字符少于 k 个,则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
视频讲解:字符串操作进阶! | LeetCode:541. 反转字符串II
class Solution:
def reverseStr(self, s: str, k: int) -> str:
i=0
n=len(s)
while i < n:
i2=i+k
s=s[:i]+s[i:i2][::-1]+s[i2:]
i+=2*k
return s
用切片整体替换,而不是一个个替换:
class Solution:
def reverseStr(self, s: str, k: int) -> str:
"""
1. 使用range(start, end, step)来确定需要调换的初始位置
2. 对于字符串s = 'abc',如果使用s[0:999] ===> 'abc'。字符串末尾如果超过最大长度,则会返回至字符串最后一个值,这个特性可以避免一些边界条件的处理。
"""
def reverse_substring(text):
left, right = 0, len(text) - 1
while left < right:
text[left], text[right] = text[right], text[left]
left += 1
right -= 1
return text
res = list(s)
for cur in range(0, len(s), 2 * k):
res[cur: cur + k] = reverse_substring(res[cur: cur + k])
return ''.join(res)
题目链接: 卡码网:54.替换数字
题目内容: 给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。 例如,对于输入字符串 “a1b2c3”,函数应该将其转换为 “anumberbnumbercnumber”。
n=input()
left=0
right=len(n)-1
ans=""
for i in n:
if ord('0')<=ord(i)<=ord("9"):
ans+="number"
else:
ans+=i
print(ans)
题目链接: 151.翻转字符串里的单词
题目内容: 给你一个字符串 s ,请你反转字符串中单词的顺序。单词是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
视频讲解:字符串复杂操作拿捏了! | LeetCode:151.翻转字符串里的单词
方式一: 先删除空白,然后整个反转,最后单词反转。 因为字符串是不可变类型,所以反转单词的时候,需要将其转换成列表,然后通过join函数再将其转换成列表,所以空间复杂度不是O(1)
class Solution:
def reverseWords(self, s: str) -> str:
#删除前后空白
s=s.strip()
#反转整个字符串
s=s[::-1]
#将字符串拆分成单词,然后反转每个单词
s=' '.join(word[::-1] for word in s.split())
return s
方式二: 使用双指针
class Solution:
def reverseWords(self, s: str) -> str:
words=s.split()
left,right=0,len(words)-1
while left<right:
words[left],words[right]=words[right],words[left]
left+=1
right-=1
return " ".join(words)
题目链接: 卡码网:55.右旋转字符串
题目内容: 字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。 例如,对于输入字符串 “abcdefg” 和整数 2,函数应该将其转换为 “fgabcde”。
k=int(input())
s=input()
left=len(s)-k
right=len(s)
s=s[left:right]+s[:left]
print(s)