首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【力扣算法09】之 6. N 字形变换 python

【力扣算法09】之 6. N 字形变换 python

作者头像
全栈若城
发布2024-02-29 19:13:42
发布2024-02-29 19:13:42
1910
举报
文章被收录于专栏:若城技术专栏若城技术专栏

问题描述

将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下:

P A H N A P L S I I G Y I R

之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“PAHNAPLSIIGYIR”。 请你实现这个将字符串进行指定行数变换的函数

string convert(string s, int numRows);

示例1

输入:s = “PAYPALISHIRING”, numRows = 3 输出:“PAHNAPLSIIGYIR”

示例2

输入:s = “PAYPALISHIRING”, numRows = 4 输出:“PINALSIGYAHRPI” 解释: P I N A L S I G Y A H R P I

示例3

输入:s = “A”, numRows = 1 输出:“A”

提示

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

思路分析

给定一个字符串 s 和一个整数 numRows,要求按照 Z 字形排列将字符串重新排序,并返回重新排序后的字符串。 首先,根据 numRows 的值判断边界情况。如果 numRows 为 1,则直接返回原字符串 s。 然后,创建 numRows 个字符串,用于保存每一行的字符。 接下来,遍历字符串 s 中的每个字符,并根据规律将字符放入对应的行中。

规律1:前 numRows 个字符依次放入每一行中。 规律2:之后的 numRows-2 行,字符依次逆序放入每一行中,即从倒数第二行开始往上逐行放置字符。 规律3:重复规律1和规律2,直到遍历完字符串 s 中的所有字符。 最后,将每一行的字符拼接起来,得到最终结果。

代码分析

  1. 首先,在代码中定义了一个 Solution 类,用于实现字符串变换的方法。
  2. 在 convert 方法中,接受两个参数 s 和 numRows,并返回变换后的字符串。
  3. 方法开始处判断 numRows 是否为 1,如果是则直接返回原字符串 s。
  4. 创建一个列表 rows,长度为 numRows,用于保存每一行的字符。这里使用了列表推导式来创建初始化的空字符串列表。
  5. 定义两个变量 curRow 和 goingDown,分别用于追踪当前字符应该放在哪一行和字符行进的方向。
  6. 遍历字符串 s 中的每一个字符。
    • 将当前字符添加到对应的行 rows[curRow] 中。
    • 如果当前行 curRow 为首行或末行,则改变字符行进的方向,即 goingDown 取反。
    • 根据字符行进的方向更新当前行 curRow 的值。
  7. 遍历完成后,利用 .join() 方法将每一行的字符拼接起来,并返回最终结果。

完整代码

代码语言:javascript
复制
class Solution(object):
    def convert(self, s, numRows):
        if numRows == 1:
            return s
        
        rows = [''] * min(numRows, len(s))  # 创建 numRows 个空字符串,用于保存每一行的字符
        curRow = 0   # 当前字符所在的行
        goingDown = False   # 字符行进的方向,初始为 False 表示向上
        
        for c in s:
            rows[curRow] += c   # 将当前字符添加到对应的行中
            
            # 根据规律1和规律2更新 curRow 和 goingDown 的值
            if curRow == 0 or curRow == numRows - 1:
                goingDown = not goingDown
            curRow += 1 if goingDown else -1
        
        return ''.join(rows)   # 将每一行的字符拼接起来,返回最终结果

详细分析

代码语言:javascript
复制
class Solution(object):

定义一个名为 Solution 的类,用于实现字符串变换的方法。

代码语言:javascript
复制
    def convert(self, s, numRows):
        if numRows == 1:
            return s

定义 convert 方法,接收两个参数:字符串 s 和整数 numRows。如果 numRows 的值为 1,即只有一行,直接返回原始字符串 s。

代码语言:javascript
复制
        rows = [''] * min(numRows, len(s))
        curRow = 0
        goingDown = False

创建长度为 numRows 的空字符串列表 rows,使用列表推导式生成。curRow 用于追踪当前字符应该放在哪一行,初始值为 0。goingDown 用于表示字符行进的方向,初始值为 False,表示向上。

代码语言:javascript
复制
        for c in s:
            rows[curRow] += c

遍历字符串 s 中的每一个字符,将当前字符 c 添加到对应行 rows[curRow] 中的末尾。

代码语言:javascript
复制
            if curRow == 0 or curRow == numRows - 1:
                goingDown = not goingDown

如果当前行 curRow 为首行或末行,则改变字符行进的方向,即 goingDown 取反。

代码语言:javascript
复制
            curRow += 1 if goingDown else -1

根据字符行进的方向来更新当前行 curRow。如果 goingDown 为 True,则 curRow 自增 1,否则自减 1。

代码语言:javascript
复制
        return ''.join(rows)

遍历完成后,使用 .join() 方法将列表 rows 中的每一行字符拼接起来,返回最终的结果字符串。

运行效果截图

调用示例

代码语言:javascript
复制
solution = Solution()
s = "PAYPALISHIRING"
numRows = 3

s1 = "PAYPALISHIRING"
numRows1 = 4

s2 = "A"
numRows2 = 1
print(solution.convert(s, numRows))
print(solution.convert(s1, numRows1))
print(solution.convert(s2, numRows2))

运行结果

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-02-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题描述
    • 示例1
    • 示例2
    • 示例3
    • 提示
  • 思路分析
  • 代码分析
  • 完整代码
  • 详细分析
  • 运行效果截图
    • 调用示例
    • 运行结果
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档