6. Z 字形变换

将一个给定字符串根据给定的行数,以从上往下、从左到右进行 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 :
    找规律,对于输出样式,每行数据在原始数组上的间隔位置有两种,记为step1step2
    step1 初始值为numRows * 2 - 2
    step2 初始值为0
    每计算一行, step1 += 2 ,step2 -=2
    对于stepx == 0的情况直接跳过

  • 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中的第一个字符放在第一个字符数组中,第二个字符放在第二个字符数组中...每当到达边界时变换存储方向。
    具体演示如图所示:


    6.Z字形变换.gif
  • 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)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。