一、题目
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下:
L C I R
E T O E S I I G
E D H N
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zigzag-conversion
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、语言
python
三、解题思路
1. 第一次见到此题,突然感觉有点懵,不知道如何下手,我就先想办法从上到下列举结果,然后把这些元素放到一个列表里,用元组或者列表装好,如下:
a = [["L", 'E', 'E'], ['', 'T', ''], ['C', 'O', 'D'], ['', 'E', ""]]
列着列着发现了新天地,发现:
1) 不管是三行还是四行,都可以看做一个矩阵,矩阵可以看作成列表里包含了小列表,为空的元素用空字符串代替。
2) 包含空字符串的列数row与numRows有关, 且row=numRows-2。
3) 且单个字符所在的位置有一定的规律,从numRows-1到2位置。
4) 最后得到的元组列表,然后直接按照位置遍历,遍历完每个元组的第一个元素后,再遍历第二个....最后拼接起来即可。
四、完整代码
"""
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下:
L C I R
E T O E S I I G
E D H N
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zigzag-conversion
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
"""
str_input = "LEETCODEISHIRING"
def set_empty_string(a, num):
for k in range(0, num):
a[k] = ""
return a
def convert(s, numRows):
target = list()
count = 0
son = []
for i in range(0, numRows):
son.append("")
for i in s:
if count < numRows:
son[count] = i
count = count + 1
elif count == numRows:
print("列表:", tuple(son), "中间元素:", i)
target.append(tuple(son))
son = set_empty_string(son, numRows)
# 添加中间元素
for j in range(numRows, 2, -1):
print("j", j)
# 因为空的那个总是从numRows-1的位置开始的,对应列表的下标为numRows-2
son[j - 2] = i
target.append(tuple(son))
son = set_empty_string(son, numRows)
count = 0
print("target", target)
# 遍历结果,逐行遍历
result = []
for i in range(0, numRows):
for j in target:
if j[i] != "":
result.append(j[i])
return result
target = convert(str_input, 3)
target = "".join(target)
print("得到的字符串为:", target)
输入3时,打印结果:
D:\pythonWorkspace\leet-code-study\venv\Scripts\python.exe D:/pythonWorkspace/leet-code-study/day02.py
列表: ('L', 'E', 'E') 中间元素: T
j 3
列表: ('C', 'O', 'D') 中间元素: E
j 3
列表: ('I', 'S', 'H') 中间元素: I
j 3
列表: ('R', 'I', 'N') 中间元素: G
j 3
target [('L', 'E', 'E'), ('', 'T', ''), ('C', 'O', 'D'), ('', 'E', ''), ('I', 'S', 'H'), ('', 'I', ''), ('R', 'I', 'N'), ('', 'G', '')]
得到的字符串为: LCIRETOESIIGEDHN
Process finished with exit code 0
输入4时,打印结果:
D:\pythonWorkspace\leet-code-study\venv\Scripts\python.exe D:/pythonWorkspace/leet-code-study/day02.py
列表: ('L', 'E', 'E', 'T') 中间元素: C
j 4
j 3
列表: ('O', 'D', 'E', 'I') 中间元素: S
j 4
j 3
列表: ('H', 'I', 'R', 'I') 中间元素: N
j 4
j 3
target [('L', 'E', 'E', 'T'), ('', '', 'C', ''), ('', 'C', '', ''), ('O', 'D', 'E', 'I'), ('', '', 'S', ''), ('', 'S', '', ''), ('H', 'I', 'R', 'I'), ('', '', 'N', ''), ('', 'N', '', '')]
得到的字符串为: LOHECDSINECESRNTII
Process finished with exit code 0