学习目标:
- 理解列表推导式的用法,以及如何使用条件语句筛选元素。
- 理解切片操作的用法,包括如何使用负数步长进行反转操作。
- 理解循环的基本概念和语法,以及如何在循环中使用取余操作。
- 完成题目,成功运行
问题描述
问题描述
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 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]
-
res[temp[i%len(temp)]] += s[i]:这是循环体中的代码,它将字符串 s 中的字符按照ZigZag模式排列到结果列表 res 中。
-
i%len(temp):这是取余操作,它将循环变量 i 限制在 temp 列表的长度范围内。这样可以确保索引不会超出 temp
列表的范围。 -
temp[i%len(temp)]:这是通过取余操作得到的索引,它表示当前字符应该放置在结果列表 res 的哪个位置。
-
res[temp[i%len(temp)]]:这是访问结果列表 res 中的特定位置,以便将当前字符添加到正确的位置上。
-
+= s[i]:这是将当前字符添加到结果列表 res 中指定位置的操作。使用 += 运算符可以将当前字符追加到已有的字符串后面,以实现按顺序排列字符的效果。
学习时间
学习这段代码的内容通常需要花费一到两个小时的时间,具体取决于个人的学习速度和经验。