1、题目
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下:
L C I R
E T O E S I I G
E D H N
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"。
示例一:
输入: s = “LEETCODEISHIRING”, numRows = 3
输出: “LCIRETOESIIGEDHN”
示例二:
输入: s = “LEETCODEISHIRING”, numRows = 4
输出: “LDREOEIIECIHNTSG”
解释:
L D R
E O E I I
E C I H N
T S G
2、分析
这道题要将一个字符串进行z行排列,简单来说是一个找规律的问题,我在这道题使用的方法是分组,根据给出的层数判断每次分组的长短,然后分别选择不同组中的各层元素。
3、代码
class Solution:
def convert(self, s: str, numRows: int) -> str:
# 判断特殊条件
if len(s)==0:return ''
if numRows==1:return s
# 进行分组的准备
dict1 = {key:''for key in range(1, numRows+1)}
# 判断分组的长度
step = numRows + numRows - 2
step1 = step
index = 0
# 将字符串补充为分组长度的倍数,方便计算
if int(len(s)%step) != 0:
s += '*'*(step - int(len(s)%step))
while step <= len(s):
ss = s[index:step]
index = step
step += step1
# 进行分组
dict1[1] += ss[0]
dict1[numRows] += ss[int(len(ss[1:])/2-0.5)+1]
for i in range(2, numRows):
dict1[i] += ss[i-1]
dict1[i] += ss[1-i]
result = ''
for res in dict1.values():
result += res
return result.replace('*', '')
4、结果
执行用时 :112 ms, 在所有 python3 提交中击败了16.94% 的用户
内存消耗 :12.8 MB, 在所有 python3 提交中击败了99.83%的用户
5、改进
改进方法只能是找到一个更好的规律,去降低算法的时间复杂度。
望您:
“情深不寿,强极则辱,谦谦君子,温润如玉”。