Skip to main content

6. Z 字形变换[Medium]

6. Z 字形变换[Medium]

https://leetcode-cn.com/problems/zigzag-conversion/

将一个给定字符串根据给定的行数,以从上往下、从左到右进行 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

中等,通过次数133,297,提交次数277,861

First Try

2020-06-04

把N转换拉直分段,找出规律即可。当row为1时为特殊情况,上传才被测试出来。

class Solution(object):
def convert(self, s, numRows):
"""
:type s: str
:type numRows: int
:rtype: str
"""
if(numRows == 1):
return s
split_len = 2 * numRows - 2
split_parts = [s[i: i+ split_len] for i in range(0, len(s), split_len)]
rv = []
for i in range(numRows):
for part in split_parts:
if(i<len(part)):
rv.append(part[i])
if(i != 0 and i != numRows - 1):
if (split_len - i < len(part)):
rv.append(part[split_len - i])
rv_s = "".join(rv)
return rv_s
  • 执行用时 :56 ms, 在所有 Python 提交中击败了72.53%的用户
  • 内存消耗 :12.8 MB, 在所有 Python 提交中击败了12.50%的用户