菜鸟成长日记
思路就是找规律,写出转换后的数组矩阵
class Solution:
def convert(self, s: str, numRows: int) -> str:
# 边界条件的判断
if len(s)==0 or numRows==1 :
return s
unit = 2 * numRows - 2 # 每个单元的字符数
#向上取整计算矩阵的列数
if len(s) % unit == 0:
cols = len(s) // unit * 2 # 把每列一个值的列并到一起,即一列满字符;一列缺头行和尾行字符
else:
cols = (len(s) // unit + 1) * 2
# 初始化矩阵
z_s = [[None] * cols for _ in range(numRows)]
for i in range(cols):
if i %2==0: # 全字符列
for j in range(numRows):
if s == "":
break
else:
z_s[j][i] = s[0]
s = s[1:]
else: # 非全字符列
for j in range(numRows-2,0,-1):
if s == "":
break
else:
z_s[j][i] = s[0]
s = s[1:]
# 输出字符串
res=""
for i in range(numRows):
for j in range(len(z_s[0])):
if z_s[i][j]:
res+=z_s[i][j]
return res
注意点:
- 将最后的矩阵分割为一个个,类似V的单元,每个单元有 u n i t = 2 ∗ n u m R o w s − 2 unit = 2 * numRows - 2 unit=2∗numRows−2个字符
- 斜线上的字符可以合并到一列中
运行结果: 时间-104 ms;内存-13.7 MB
------------------------------------------------------------------更新-----------------------------------------------------------------
参考用户Krahets的题解,将代码更改了一下,变得更简洁
class Solution:
def convert(self, s: str, numRows: int) -> str:
if numRows < 2:
return s
res = ["" for _ in range(numRows)] # 用元素代替list
i, flag = 0, -1
for c in s:
res[i] += c
if i == 0 or i == numRows - 1: # 翻转的边界条件判断
flag = -flag # flag为步进值,起到递增和递减的作用
i += flag
return "".join(res)
运行结果: 时间-56 ms;内存-13.8 MB