代码随想录算法训练营第八天 | 字符串part01

88 阅读4分钟

代码随想录算法训练营第八天 | 字符串part01

344 反转字符串

image.png

方法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

image.png

思路:按照题目来就行,但是需要注意题目中有一个“”字,所以说就需要先进行循环,看看能来几次

    # 首先需要记录一共可以来几轮
    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 代码的特征:

  1. 简洁明了:尽量用少量的代码实现功能,但不牺牲可读性。
  2. 利用 Python 特有的语言特性:如列表推导式、生成器表达式、装饰器等。
  3. 遵循 PEP 8 风格指南:这是 Python 的官方代码风格指南。
  4. 使用内置函数和库:优先使用 Python 内置的函数和标准库,而不是重新发明轮子。
  5. 使用适当的数据结构:如使用字典来实现快速查找,使用集合来去重等。
  6. 遵循"Python 之禅":这是一组指导 Python 编程的原则,如"简洁胜于复杂"、"可读性很重要"等。
  7. 使用描述性的命名:变量和函数名应该清晰地表达其用途。
  8. 合理使用迭代器和生成器:这些可以提高内存效率。
  9. 适当使用异常处理:用 try/except 结构来处理异常,而不是大量的条件判断。
  10. 使用上下文管理器:如使用 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 替换数字

image.png

    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))