LeetCode 6. Z 字形变换

题目描述

解题思路

  • 建立一个字符列表,其中的元素表示各行包含的Z型字符
  • 来回遍历这个列表,依次将字符串的下一个字符添加进当前遍历元素的末尾
  • 连接这个列表的元素,返回结果

本人代码

class Solution:
    def convert(self, s: str, numRows: int) -> str:
        Z_list = ['' for _ in range(numRows)]   # 每个元素表示该行的字符
        it = iter(s)
        i = 0
        flag = True     # 判断字符串是否遍历完
        while flag:
            if i == 0:
                # 正向遍历
                for i in range(numRows):
                    try:
                        char = next(it)
                        Z_list[i] += char
                    except StopIteration:
                        flag = False
                        break
            elif i == len(Z_list) - 1:
                # 逆向遍历,只需遍历除去第一行和最后一行的行,避免重复
                for i in range(numRows-2, 0, -1):
                    try:
                        char = next(it)
                        Z_list[i] += char
                    except StopIteration:
                        flag = False
                        break
                i -= 1  # 需要 i-1 来使 i == 0

        Z_str = ''.join(Z_list)
        return Z_str

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)

运行结果
在这里插入图片描述

官方代码(更简洁)

class Solution:
    def convert(self, s: str, numRows: int) -> str:
        if numRows == 1:
            return s
            
        Z_list = ['' for _ in range(numRows)]   # 每个元素表示该行的字符
        
        curRow = 0
        goingDown = False
        for char in s:
            Z_list[curRow] += char
            if (curRow == 0 or curRow == numRows - 1):
                goingDown = not goingDown
            curRow += 1 if goingDown else -1

        Z_str = ''.join(Z_list)
        return Z_str

运行结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值