[LeetCode]6.Z字形变换.python

学习目标:

  • 理解列表推导式的用法,以及如何使用条件语句筛选元素。
  • 理解切片操作的用法,包括如何使用负数步长进行反转操作。
  • 理解循环的基本概念和语法,以及如何在循环中使用取余操作。
  • 完成题目,成功运行

问题描述

问题描述
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 “LEETCODEISHIRING” 行数为 3 时,排列如下:
在这里插入图片描述

之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:在这里插入图片描述
“LCIRETOESIIGEDHN”。
请你实现这个将字符串进行指定行数变换的函数:

示例 1:
在这里插入图片描述

示例 2:在这里插入图片描述

————————————————

代码实现

class Solution:
    def convert(self, s: str, numRows: int) -> str:
        temp = [i for i in range(numRows)]
        temp += temp[1:-1][::-1]

        num = len(s)
        res = [""]*numRows

        for i in range(num):
            res[temp[i%len(temp)]] += s[i]

        return "".join(res)

代码分析

class Solution:
    def convert(self, s: str, numRows: int) -> str:
        temp = [i for i in range(numRows)]
        temp += temp[1:-1][::-1]

temp 是一个列表,用于存储每一行的索引。它首先包含了从 0 到 numRows-1 的数字,然后将中间部分的索引进行反转并添加到列表中。这样可以创建一个用于按照 ZigZag 模式排列字符的索引列表。

        res = [''] * numRows
        n = len(s)

res 是一个列表,用于存储每一行的字符。它初始化为包含 numRows 个空字符串的列表。
n 是字符串 s 的长度。

        for i in range(n):
            res[temp[i%len(temp)]] += s[i]

使用循环遍历字符串 s 中的每个字符。
i%len(temp) 的结果是当前字符应该放置的行的索引。通过将当前字符添加到对应行的字符串中,可以按照 ZigZag 模式将字符排列在不同的行上。

        return ''.join(res)

使用 join() 方法将每一行的字符连接成一个字符串,并返回结果。

代码详解

temp = [i for i in range(numRows)]

这句代码使用列表推导式创建了一个包含从 0 到 numRows-1 的数字的列表。例如,如果 numRows 的值为 4,那么 temp 的值将为 [0, 1, 2, 3]。

temp += temp[1:-1][::-1]

这句代码将中间部分的索引进行反转并添加到 temp 列表中。具体来说,它使用切片操作 temp[1:-1] 获取 temp 列表中除了第一个和最后一个元素之外的部分,然后使用切片操作 [::-1] 将这部分进行反转。最后,使用 += 运算符将反转后的部分添加到 temp 列表的末尾。
让我们以 numRows 的值为 4 为例来说明这个过程:
初始时,temp 的值为 [0, 1, 2, 3]。
temp[1:-1] 的值为 [1, 2]。
temp[1:-1][::-1] 的值为 [2, 1]。
因此,最终 temp 的值将为 [0, 1, 2, 3, 2, 1]。

        for i in range(n):
            res[temp[i%len(temp)]] += s[i]
  1. res[temp[i%len(temp)]] += s[i]:这是循环体中的代码,它将字符串 s 中的字符按照ZigZag模式排列到结果列表 res 中。

  2. i%len(temp):这是取余操作,它将循环变量 i 限制在 temp 列表的长度范围内。这样可以确保索引不会超出 temp
    列表的范围。

  3. temp[i%len(temp)]:这是通过取余操作得到的索引,它表示当前字符应该放置在结果列表 res 的哪个位置。

  4. res[temp[i%len(temp)]]:这是访问结果列表 res 中的特定位置,以便将当前字符添加到正确的位置上。

  5. += s[i]:这是将当前字符添加到结果列表 res 中指定位置的操作。使用 += 运算符可以将当前字符追加到已有的字符串后面,以实现按顺序排列字符的效果。

学习时间

学习这段代码的内容通常需要花费一到两个小时的时间,具体取决于个人的学习速度和经验。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值