将一个给定字符串根据给定的行数,以从上往下、从左到右进行 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);
示例 1:
输入: s = "LEETCODEISHIRING", numRows = 3
输出: "LCIRETOESIIGEDHN"
示例 2:
输入: s = "LEETCODEISHIRING", numRows = 4
输出: "LDREOEIIECIHNTSG"
解释:
L D R
E O E I I
E C I H N
T S G
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zigzag-conversion
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路1 :
找规律,对于输出样式,每行数据在原始数组上的间隔位置有两种,记为 与
初始值为
初始值为
每计算一行, ,
对于的情况直接跳过Python代码实现:
class Solution:
def convert(self, s: str, numRows: int) -> str:
n = len(s)
if n <= numRows or numRows == 1:
return s
ans = ''
step1 = numRows * 2 - 2
step2 = 0
for i in range(numRows):
index = i
ans += s[index]
while index < n:
index += step1
if step1 != 0 and index < n:
ans += s[index]
index += step2
if step2 != 0 and index < n:
ans += s[index]
step1 -= 2
step2 += 2
return ans
-
思路二:
此思路借鉴leetcode评论区大神
使用字符串数组直接模拟整个过程
设置numRows个字符数组,每个字符数组存储对应行的存储结果
遍历字符串s,将s中的第一个字符放在第一个字符数组中,第二个字符放在第二个字符数组中...每当到达边界时变换存储方向。
具体演示如图所示:
python实现代码
def convert(s: str, numRows: int) -> str:
if numRows == 1 or numRows >= len(s):
return s
r = [''] * numRows
j = 0
k = 1
for i in s:
r[j] += i
j += k
if j == 0 or j == numRows - 1:
k = -k
return "".join(r)