当前位置: 首页 > wzjs >正文

唐山市城市建设规划局网站蜜雪冰城网络营销

唐山市城市建设规划局网站,蜜雪冰城网络营销,wordpress 杂志主题,外贸婚纱网站 侵权Swift | Z 字形变换(Zigzag Conversion)详解与实现 🧩 题目描述 给定一个字符串 s 和一个行数 numRows,请按照从上往下、再从下往上的“Z”字形排列这个字符串,并按行输出最终结果。例如: 输入&#xff…

Swift | Z 字形变换(Zigzag Conversion)详解与实现

🧩 题目描述

给定一个字符串 s 和一个行数 numRows,请按照从上往下、再从下往上的“Z”字形排列这个字符串,并按行输出最终结果。例如:

输入:

s = "PAYPALISHIRING"
numRows = 3

Z 字形排列如下:

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

输出字符串为:“PAHNAPLSIIGYIR”


🧠 题目理解与思路解析

目标:将字符串按 Z 字形排列后,再逐行读取,拼成新的字符串。

Z字形结构特点

  • 每个“Z”形周期包含:竖向向下 + 斜向向上(不含两端)
  • 举例,numRows = 3,Z 周期宽度为 4下(3)+ 斜上(1) = 4
  • 举例,numRows = 4,Z 周期宽度为 6下(4)+ 斜上(2) = 6

因此,我们只需按照这个顺序依次将字符“填”到对应的行中,最后逐行拼接输出即可。


🔧 Swift 实现

func convert(_ s: String, _ numRows: Int) -> String {// 边界情况:如果只有一行,直接返回原字符串if numRows == 1 || numRows >= s.count {return s}// 创建 numRows 个空字符串用于收集每一行的字符var rows = Array(repeating: "", count: numRows)var currentRow = 0       // 当前字符所在的行var goingDown = false    // 控制方向是否向下// 遍历字符串中的每个字符for char in s {// 将字符添加到当前行rows[currentRow] += String(char)// 如果到达最顶部或最底部,则改变方向if currentRow == 0 || currentRow == numRows - 1 {goingDown.toggle()}// 根据方向决定下一行currentRow += goingDown ? 1 : -1}// 拼接所有行的字符return rows.joined()
}

📈复杂度分析

✅ 时间复杂度:O(n)

  • n 为字符串 s 的长度。
  • 每个字符都被访问一次,插入到对应的行中。

✅ 空间复杂度:O(n)

  • 存储中间的行数组 rows,最多 n 个字符分布在其中。

☑️可选实现方式

方法二:按照周期直接计算索引(按坐标模拟)

  • 每一个 Z 字形周期长度为 cycleLen = 2 * numRows - 2
  • 可以根据当前字符的索引 i,通过 i % cycleLen 判断它属于哪一行。
func convert(_ s: String, _ numRows: Int) -> String {if numRows == 1 || numRows >= s.count { return s }var rows = Array(repeating: "", count: numRows)let cycleLen = 2 * numRows - 2for (i, char) in s.enumerated() {let pos = i % cycleLenlet row = pos < numRows ? pos : cycleLen - posrows[row] += String(char)}return rows.joined()
}

💡 优点

  • 不用维护方向变量 goingDown,逻辑更数学化,适合喜欢用索引推理的同学。

📌 总结

方法易读性实现难度性能推荐场景
按行构建✅ 高⭐⭐✅ 优新手友好,适合面试
索引模拟周期⭐ 中⭐⭐⭐✅ 优偏数学推理,适合进阶

🎁 如果你想打印字符矩阵,那么👇自取

func printZMatrix(_ s: String, _ numRows: Int) {if numRows == 1 || numRows >= s.count {print(s)return}let cycleLen = 2 * numRows - 2let numCols = (s.count / cycleLen + 1) * (numRows - 1)var matrix = Array(repeating: Array(repeating: " ", count: numCols), count: numRows)var row = 0, col = 0var index = 0let chars = Array(s)while index < chars.count {// 向下for r in 0..<numRows where index < chars.count {matrix[r][col] = String(chars[index])index += 1}// 向右上for r in stride(from: numRows - 2, through: 1, by: -1) where index < chars.count {col += 1matrix[r][col] = String(chars[index])index += 1}col += 1}// 打印矩阵for row in matrix {print(row.joined())}
}

🧪示例调用:

printZMatrix("PAYPALISHIRING", 4)

输出示例:

P     I    N
A   L S  I G
Y A   H R
P     I
http://www.dtcms.com/wzjs/834833.html

相关文章:

  • 网站详情页设计国内wordpress主机
  • 智能网站建设桂林论坛网
  • 网站建设尺寸大小丽江市网站建设
  • 企业网站建设的目的论文网站开发学习流程
  • 手机版企业网站wordpress 美化 插件大全
  • 网站内容好阿里巴巴黄页网1688
  • 注册一个域名需要多少钱旺道seo软件技术
  • 一般做海报的图片跟哪个网站下载网页微博版
  • 杭州江干网站建设云主题 wordpress
  • 贵阳网站微信建设公司课程网站建设的步骤
  • 平台和自建网站服务提供者学校网站开发研究的意义和目的
  • 做帖子的网站有哪些查询个人公司注册公司
  • 怎样制作微信网站链接如何查看一家网站是否有备案
  • 建站 网站程序建网站去哪里备案
  • 网站建设的步骤及方法在线自助下单网站
  • 如何做自己的网站商城站钦州网站建设
  • 中国建设网官方网站证书查询龙岗区建设规划网站
  • 宣传型网站做网站的网页图片素材怎么找
  • 中国城乡建设部网站荣欣建设集团有限公司网站
  • 怎么做网站的学校的大图天津塘沽爆炸视频完整
  • 网站建立的连接不安全怎么解决seo整站优化服务教程
  • 备案网站内容说明大丰企业做网站多少钱
  • 电子商城开发网站开发网站建设一般收多少定金
  • 网站直播间 是怎么做的哈尔滨建设发展集团有限责任公司
  • 企业网站建设开发公司做网站需要考虑seo吗
  • 网站建设开发费入什么科目镇江外贸型网站建设
  • 贵阳市网站优化钓鱼网站的域名怎么不稳定
  • 广州设计网站培训学校电脑游戏网站建设
  • 柳州公积金网站wordpress无限登录密码
  • 哈尔滨 网站建设仟路如何编程做网站