声明:
今天是中等题第4道题。将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。以下所有代码经过楼主验证都能在LeetCode上执行成功,代码也是借鉴别人的,在文末会附上参考的博客链接,如果侵犯了博主的相关权益,请联系我删除
(手动比心ღ( ´・ᴗ・` ))
正文
题目:将一个给定字符串根据给定的行数,以从上往下、从左到右进行 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" 解释:L C I R E T O E S I I G E D H N示例 2:
输入: s = "LEETCODEISHIRING", numRows = 4 输出: "LDREOEIIECIHNTSG" 解释: L D R E O E I I E C I H N T S G
解法1。观察可以发现一些规律,相邻两列之间的差=2*numRows-2,再看看每行的元素下边index和行数的关系,总结如下:
- 首尾两行:只有(lens+numRows-2)/2*(n-2)个元素
- 中间的下标和行数i及第j位的关系是:j-2*i+k
执行用时: 120 ms, 在ZigZag Conversion的Python3提交中击败了82.53% 的用户
class Solution:
def convert(self, s, numRows):
"""
:type s: str
:type numRows: int
:rtype: str
"""
k = 2*numRows - 2
if not s or numRows == 0 or numRows == 1:
return s
lens = len(s)
res = ''
for i in range(numRows):
for j in range(i,lens,k):
res += s[j]
if i != 0 and i != numRows and j-2*i+k < lens:
res += s[j-2*i+k]
return res
结尾
解法1:https://blog.csdn.net/chenhua1125/article/details/80412550