leetcode第六题 ——Z字型变化
2019-11-09 本文已影响0人
不分享的知识毫无意义
1.题目
原题:
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下:
L C I R
E T O E S I I G
E D H N
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"。
例子:
输入: s = "LEETCODEISHIRING", numRows = 4
输出: "LDREOEIIECIHNTSG"
解释:
L D R
E O E I I
E C I H N
T S G
2.解析
这道题不涉及任何数据结构的知识,就是一个简单的找规律问题,把规律找到这道题就可以解决。
这道题在做的过程中,遇到了几个问题,记录一下:
- n个空列表生成的问题
python可以使用列表推导式生成空列表,以供不同的场景使用 - 列表转字符串的问题
可以用''.join(list_name)的形式实现 - 逻辑问题
可以发现规律,设置游标和数组记录不同行应该记录的东西,再把列表连接起来。
3.python代码
class Solution:
def convert(self, s, numRows):
if numRows == 1:
return s
list_Set = [[] for _ in range(numRows)]
i = 0
column = 0
cflag = 0
while i < len(s):
if cflag % (numRows - 1) == 0:
list_Set[column].append(s[i])
i += 1
else:
if column == numRows - cflag - 1:
list_Set[column].append(s[i])
i += 1
else:
i = i
column += 1
if column == numRows:
cflag += 1
column = 0
if cflag == numRows - 1:
cflag = 0
out_list = []
for _ in list_Set:
out_list.extend(_)
return ''.join(out_list)
这样做完效率比较低,主要是执行的操作比较多,可以进行进一步优化,后续再思考。