【LeetCode 中等题】4-Z字形变换

声明:

今天是中等题第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

猜你喜欢

转载自blog.csdn.net/weixin_41011942/article/details/84555759