代码随想录算法训练营|Day 8
Day 8
第四章 字符串part01
今日任务
● 344.反转字符串
● 541. 反转字符串II
● 卡码网:54.替换数字
详细布置
344.反转字符串
建议: 本题是字符串基础题目,就是考察 reverse 函数的实现,同时也明确一下 平时刷题什么时候用 库函数,什么时候 不用库函数
题目链接/文章讲解/视频讲解:https://programmercarl.com/0344.反转字符串.html
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
其他写法:
s[:] = reversed(s)
s.reverse()
s[:] = s[::-1]
s[:] = [s[i] for i in range(len(s) - 1, -1, -1)]
541. 反转字符串II
建议:本题又进阶了,自己先去独立做一做,然后在看题解,对代码技巧会有很深的体会。
题目链接/文章讲解/视频讲解:https://programmercarl.com/0541.反转字符串II.html
知识:
当需要固定规律一段一段去处理字符串的时候,要想想在for循环的表达式上做做文章
方案 v1:reverse_substring
+ 切片整体替换
class Solution:
def reverseStr(self, s: str, k: int) -> str:
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) # 转为 list 便于原地修改
for cur in range(0, len(s), 2 * k):
res[cur: cur + k] = reverse_substring(res[cur: cur + k])
return ''.join(res)
思路:
- 把字符串转成 list,方便交换字符。
- 每隔 2k 个字符取前 k 个:
res[cur: cur + k]
- 调用
reverse_substring
:手写双指针反转。 - 切片整体替换反转后的部分。
- 最后用
join
转回字符串。
方案 v2:纯字符串拼接(不转 list)
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:]
p += 2 * k
return s
思路:
-
每次取前
k
个:s[p:p2]
-
直接用切片反转:
[::-1]
-
拼接反转后 + 其余部分。
-
更新指针,每次跳 2k。
方案 v3:list + 切片反转(更简洁)
class Solution:
def reverseStr(self, s: str, k: int) -> str:
i = 0
chars = list(s)
while i < len(chars):
chars[i:i + k] = chars[i:i + k][::-1]
i += 2 * k
return ''.join(chars)
思路:
- 转成 list(方便修改)。
- 每次直接
chars[i:i + k] = 反转切片
- i 每次跳 2k。
- 最后转回字符串。
卡码网:54.替换数字
建议:对于线性数据结构,填充或者删除,后序处理会高效的多。好好体会一下。
题目链接/文章讲解:替换数字
知识:
class Solution(object):
def subsitute_numbers(self, s):
"""
:type s: str
:rtype: str
"""
count = sum(1 for char in s if char.isdigit()) # 统计数字的个数
expand_len = len(s) + (count * 5) # 计算扩充后字符串的大小, x->number, 每有一个数字就要增加五个长度
res = [''] * expand_len
new_index = expand_len - 1 # 指向扩充后字符串末尾
old_index = len(s) - 1 # 指向原字符串末尾
while old_index >= 0: # 从后往前, 遇到数字替换成“number”
if s[old_index].isdigit():
res[new_index-5:new_index+1] = "number"
new_index -= 6
else:
res[new_index] = s[old_index]
new_index -= 1
old_index -= 1
return "".join(res)
if __name__ == "__main__":
solution = Solution()
while True:
try:
s = input()
result = solution.subsitute_numbers(s)
print(result)
except EOFError:
break