LeetCode Python3——6. Z字形变换

问题描述

将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 “LEETCODEISHIRING” 行数为 3 时,排列如下:
L     C     I    R
E T  O E  S I  I  G
E     D    H   N
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“LCIRETOESIIGEDHN”。。

示例 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

Sol 1: (等差数列)
class Solution:
    def convert(self, s, numRows):
        """
        :type s: str
        :type numRows: int
        :rtype: str
        """
        tr=""
        if numRows==1: return s
        for i in range(numRows):
            j=i       
            if i==0 or i==numRows-1:
                 while(j<len(s)):
                        tr=tr+s[j]
                        j=j+2*numRows-2
            else:
                 while(j<len(s)):
                    tr=tr+s[j]
                    j=j+2*numRows-2-2*i
                    if(j<len(s)):
                        tr=tr+s[j]
                    j=j+2*i
        return tr

从上式的三排和四排的情况,可以找出第一行和最后一行的规律是
j = j + 2 ∗ n u m R o w s − 2 j=j+2*numRows-2 j=j+2numRows2 j j j代表的是下一个词的位置。同理,除首末行之外的行的规律是 j = j + 2 ∗ n u m R o w s − 2 − 2 i j=j+2*numRows-2-2i j=j+2numRows22i,以及 j = j + 2 i j=j+2i j=j+2i(没错,会多插一个位置,可以根据画图知道)。

运行时间:216ms 内存占用:6.6M

Sol 2: (压缩矩阵)
class Solution:
    def convert(self, s, numRows):
        """
        :type s: str
        :type numRows: int
        :rtype: str
        """
        if numRows == 1:
            return s
        zigzag = ['' for i in range(numRows)]  # 初始化zigzag为['','','']
        row = 0                                # 当前的行数
        step = 1                               # 步数:控制数据的输入
        for c in s:
            if row == 0:
                step = 1
            if row == numRows - 1:
                step = -1
            zigzag[row] += c
            row += step
        return ''.join(zigzag)

这个方法如下表所示:

参考https://www.cnblogs.com/mzct123/p/5914383.html

17
26812
35911
410

压缩后:

17
26812
35911
410

这样一来就可以通过调整step来根据加入每个词。

运行时间:92ms 内存占用:6.6M

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值