likes
comments
collection
share

【LeetCode】6. Z 字形变换

作者站长头像
站长
· 阅读数 14

【LeetCode】6. Z 字形变换

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

    【LeetCode】6. Z 字形变换

  • 题目示例

    【LeetCode】6. Z 字形变换

  • 题目解析

    • 1 <= s.length <= 1000
    • s 由英文字母(小写和大写)、',' 和 '.' 组成
    • 1 <= numRows <= 1000

二、思路分析:

我们读取题意,该题要求对一串字符串进行Z字形排序并输出。同样我们也需要对题目细节进行明确:

  • 题目会给出字符串s和行数numRows
  • Z 字形排序的特点:从上到下 + 45度斜上,依次重复

根据我们做过的498. 对角线遍历思路有异曲同工之妙。因此,解答该题我们仍然需要通过示例来推理一番如题目中栗子2

【LeetCode】6. Z 字形变换

通过案例推理,我们发现了Z字形遍历与行数的关系:

  • 每一个周期次数是两倍行数减二即 t = 2*numRows-2
  • 每个周期第一个字符索引位置r+i,[i范围0,len(s)-r]
  • 每个周期第二个字符索引位置r + i -1

因此,根据上述我们找到的规律,直接使用模拟构建的方法,如下是Python实现的代码:

class Solution(object):
    def convert(self, s, numRows):
        """
        :type s: str
        :type numRows: int
        :rtype: str
        """
        n = len(s)
        ans = []
        t = 2*numRows-2
        if n <= numRows or numRows == 1 : return s

        for r in range(numRows):
            for i in range(0, n - r, t): 
                ans.append(s[i+r])
                if 0 < r < numRows-1 and i+t-r < n :
                    ans.append(s[i+t-r])
        return "".join(ans)

三、总结:

本题仍然考察我们对行和列之间关系,找到关系之后通过模拟方法就能轻松实现,AC提交记录如下:

【LeetCode】6. Z 字形变换

  • 时间复杂度:O(n),其中 n 为字符串 s 的长度
  • 空间复杂度:O(1)

以上本期内容,欢迎大佬们点赞评论,下期见~~~