代码随想录算法训练营第八天 | 字符串part01
344 反转字符串
方法1:双指针
left , right = 0, len(s) - 1
while(left < right):
s[left] , s[right] = s[right] , s[left]
left += 1
right -= 1
return s
方法2: 使用栈
stack = []
for char in s:
stack.append(char)
for i in range(len(s)):
s[i] = stack.pop()
方法3:使用range
n = len(s)
for i in range(n // 2):
s[i], s[n - i - 1] = s[n - i - 1], s[i]
方法4: 使用reversed
s[:] = reversed(s)
方法5: 使用切片
s[:] = s[::-1]
方法6: 使用列表推导
s[:] = [s[i] for i in range(len(s) - 1, -1, -1)]
方法7: 使用reverse()
# 原地反转,无返回值
s.reverse()
541 反转字符串II
思路:按照题目来就行,但是需要注意题目中有一个“至”字,所以说就需要先进行循环,看看能来几次
# 首先需要记录一共可以来几轮
s = "abcdefg"
k = 2
count = len(s) // (2 * k)
# 用quan来记录圈数
quan = 0
s_list = list(s)
while count > 0:
count -= 1
left = quan * 2 * k
right = left + k - 1
while left < right:
s_list[left] , s_list[right] = s_list[right] , s_list[left]
left += 1
right -= 1
quan += 1
# 现在来看剩下多少
count = len(s) // (2 * k)
extra = len(s) - count * 2 * k
if extra < k :
left = quan * 2 * k
right = len(s) - 1
while left < right:
s_list[left] , s_list[right] = s_list[right] , s_list[left]
left += 1
right -= 1
elif k <= extra < 2 * k:
left = quan * 2 * k
right = left + k - 1
while left < right:
s_list[left] , s_list[right] = s_list[right] , s_list[left]
left += 1
right -= 1
s_list = "".join(s_list)
print(s_list)
方法1
# 方法1:使用切片和自定义反转函数
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
def reverse_str(s: str, k: int) -> str:
# 将字符串转换为列表,因为字符串是不可变的
res = list(s)
# 每隔2k个字符,反转前k个字符
for cur in range(0, len(s), 2 * k):
# 使用切片获取需要反转的部分,并用反转后的结果替换
res[cur: cur + k] = reverse_substring(res[cur: cur + k])
# 将列表转回字符串并返回
return ''.join(res)
方法2
def reverse_str_2(s: str, k: int) -> str:
p = 0
while p < len(s):
p2 = p + k
# 反转从p到p2的子串,并与原字符串的其他部分拼接
# [::-1] 是 Python 中反转序列的切片语法
s = s[:p] + s[p: p2][::-1] + s[p2:]
# 移动到下一个2k组的开始
p = p + 2 * k
return s
pythonic
"Pythonic" 是一个形容词,用来描述符合 Python 语言特性、风格和理念的代码。它通常指的是编写出既高效又易读、充分利用 Python 独特特性的代码。以下是一些 Pythonic 代码的特征:
- 简洁明了:尽量用少量的代码实现功能,但不牺牲可读性。
- 利用 Python 特有的语言特性:如列表推导式、生成器表达式、装饰器等。
- 遵循 PEP 8 风格指南:这是 Python 的官方代码风格指南。
- 使用内置函数和库:优先使用 Python 内置的函数和标准库,而不是重新发明轮子。
- 使用适当的数据结构:如使用字典来实现快速查找,使用集合来去重等。
- 遵循"Python 之禅":这是一组指导 Python 编程的原则,如"简洁胜于复杂"、"可读性很重要"等。
- 使用描述性的命名:变量和函数名应该清晰地表达其用途。
- 合理使用迭代器和生成器:这些可以提高内存效率。
- 适当使用异常处理:用 try/except 结构来处理异常,而不是大量的条件判断。
- 使用上下文管理器:如使用 with 语句来自动管理资源。
举个简单的例子,以下是一个非 Pythonic 和 Pythonic 的对比:
非 Pythonic:
# 找出列表中的偶数
numbers = [1, 2, 3, 4, 5]
even_numbers = []
for num in numbers:
if num % 2 == 0:
even_numbers.append(num)
Pythonic:
# 找出列表中的偶数
numbers = [1, 2, 3, 4, 5]
even_numbers = [num for num in numbers if num % 2 == 0]
卡码网:54 替换数字
s = input()
lst = list(s) # Python里面的string也是不可改的,所以也是需要额外空间的。空间复杂度:O(n)。
for i in range(len(lst)):
if lst[i].isdigit():
lst[i] = "number"
print(''.join(lst))