春招第一步,算法伴我行
计划着每天研究几道算法题,各个类型尽可能都包含,自己写出来,好做增强。基本都使用python语言编写,主要讲一下自己的思路,以及AC情况。水平不够,大家多指正,不吝赐教,十分感谢。
题目描述:
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 “LEETCODEISHIRING” 行数为 3 时,排列如下:
L C I R
E T O E S I I G
E D H N
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"
。
请你实现这个将字符串进行指定行数变换的函数:
string convert(string s, int numRows);
示例:
s = "LEETCODEISHIRING", numRows = 3 ——> "LCIRETOESIIGEDHN" "
s = "LEETCODEISHIRING", numRows = 4 ——> "LDREOEIIECIHNTSG
思路:
Z字形变换共包含numRows行,使用一个numRows行的二维矩阵来存储Z字形变换之后的结果,然后在通过拼接矩阵中的每一行,就可以得到最后的结果。
关键问题是:怎么得到这个二维矩阵里面的每个元素?观察下图:
首先需要确定方向direction是下降还是上升,下降过程中direction=1,上升过程中direction=-1,然后对于每一行,行数则可以通过c+direction来确定。需要格外注意的是第一行和最后一行,以此来判断到底是下降还是上升:if c == 0 and direction = -1: direction = 1
(斜方向到达第一行),if c >= numRows: direction = -1
(到达最后一行)。然后就依次存储每个元素在对应的行result[c]。
整个过程只需要寻找改变的方向,在最后一行和第一行进行方向改变,然后再对每个处理的字符找到需要存放的位置。
result = [[] for _ in range(len(numRows))]
c = 0
direction = 1
for p in s:
result[c].append(p)
if c >= numRows:
direction = -1
elif c == 0 and direction == -1:
direction = 1
else:
c+= direction
完整代码:
class Solution:
def convert(self, s, numRows):
"""
:type s: str
:type numRows: int
:rtype: str
"""
if numRows==1 or not s:
return s
dp = [[] for _ in range(numRows)]
c = 0
direction = 1
res = ''
for p in s:
dp[c].append(p)
if c>= numRows-1:
direction = -1
elif c==0 and direction == -1:
direction = 1
c += direction
for i in range(len(dp)):
res += ''.join(dp[i])
return res
下午去面汇顶,抓住一切可能机会,尽力。