代码随想录算法训练营|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
posted @ 2025-06-18 23:48  ForeverEver333  阅读(5)  评论(0)    收藏  举报