题解:z-字变换[python3]-leetcode-6

一、简介

在做Z字变换过程中,本人想到用数学思维去解释这道题,找列和行之间的规律,然后按照数学公式来进行计算,在做的过程中发现当数据变化后很可能造成结果不正确,在解题过程中发现了一个规律方法,且时间复杂度和空间复杂度都为O(N)。

引用:Z 字形变换(清晰图解)

二、题解

在这里插入图片描述

以上图为例,三行,[0]、[1]、[2]为行号,中1~9为字符串,希望输出159 2468 37。

从图中可以明显得出一个规律,顺序遍历数据过程中,索引都是[0],[1],[2],[1],[0],[1],[2]…。过程中在遍历到1、3、5、7、9都是反转折点。在几个点index都会顺序增和减,即[0],[1],[2] - [1],[0] - [1],[2] - [1],[0] - ,-标识反转位置。

三、实现流程

遍历字符串:

1、str[i] += c: 把每个字符 c 填入对应行
2、i += lag: 更新当前字符 c 对应的行索引
3、lag = - lag: 在达到Z字形转折点时,执行反向

代码:

# @lc code=start
class Solution:
    def convert(self, s: str, numRows: int) -> str:
        if numRows < 2:
            return s
        # 制作列表
        res = ["" for _ in range(numRows)]
        i, flag = 0, -1
        for c in s:
            # 对应行索引插入数据
            res[i] += c
            if i == 0 or i == numRows - 1:
                # 到达转折点进行反转
                flag = -flag
            i += flag
        return "".join(res)

# @lc code=end
四、运行情况
Accepted
1157/1157 cases passed (52 ms)
Your runtime beats 88.21 % of python3 submissions
Your memory usage beats 49.16 % of python3 submissions (15.2 MB)

欢迎访问博客留言

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值