【LeetCode】6-Z字形变换

欢迎来到李耶的频道【LeetCode面试题】。


Z 字形变换

🔗 LeetCode 原题链接

题目

将一个给定字符串 s 根据给定的行数 numRows,以从上往下、从左到右进行 Z 字形排列。

比如输入字符串为 "PAYPALISHIRING",行数为 3 时,排列如下:

复制代码
P   A   H   N
A P L S I I G
Y   I   R

之后,你的输出需要从左到右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"

请你实现这个将字符串进行指定行数变换的函数。

复制代码
输入:s = "PAYPALISHIRING", numRows = 3
输出:"PAHNAPLSIIGYIR"

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

输入:s = "A", numRows = 1
输出:"A"

解法一:按行模拟(顺序遍历)

思路 :用 numRows 个字符串数组来存储每行的字符。遍历原字符串,用 currentRowdirection(向下或向上)控制当前字符应该放到哪一行。当到达顶部或底部时改变方向。

javascript 复制代码
function convert(s, numRows) {
  if (numRows === 1 || s.length <= numRows) return s;

  const rows = new Array(numRows).fill('');
  let currentRow = 0;
  let goingDown = false;

  for (const char of s) {
    rows[currentRow] += char;
    if (currentRow === 0 || currentRow === numRows - 1) {
      goingDown = !goingDown;
    }
    currentRow += goingDown ? 1 : -1;
  }

  return rows.join('');
}
  • 时间复杂度 / 空间复杂度:O(n) / O(n)
  • 优势:思路直观,代码简洁,容易理解,是面试中最推荐的写法

解法二:按行访问(数学规律法)

思路 :直接按行顺序访问原字符串中的字符。对于第 0 行和第 numRows-1 行,字符间隔为 cycleLen = 2 * numRows - 2;对于中间行,需要额外访问斜线上的字符,间隔为 cycleLen - 2 * i

javascript 复制代码
function convert(s, numRows) {
  if (numRows === 1 || s.length <= numRows) return s;

  const n = s.length;
  const cycleLen = 2 * numRows - 2;
  let result = '';

  for (let i = 0; i < numRows; i++) {
    for (let j = i; j < n; j += cycleLen) {
      result += s[j];
      // 中间行还需要添加斜线上的字符
      if (i !== 0 && i !== numRows - 1) {
        const nextIndex = j + cycleLen - 2 * i;
        if (nextIndex < n) {
          result += s[nextIndex];
        }
      }
    }
  }

  return result;
}
  • 时间复杂度 / 空间复杂度:O(n) / O(1)(不计输出字符串)
  • 优势:空间效率更高,但逻辑稍复杂,面试中可作为进阶解法展示

解法对比

解法 时间 / 空间复杂度 优势 推荐指数
按行模拟 O(n) / O(n) 直观易懂,不易出错 ⭐⭐⭐⭐⭐
按行访问 O(n) / O(1) 空间更优,体现数学思维 ⭐⭐⭐⭐

扩展题

  1. 对角线遍历 :给定一个 m x n 的矩阵,按照对角线顺序遍历并返回结果。
  2. 螺旋矩阵 :给定一个 m x n 的矩阵,按照螺旋顺序返回所有元素。
  3. 字符串的排列 :给定两个字符串 s1s2,判断 s2 是否包含 s1 的排列。

"善弈者,通盘无妙手。" ------ 《棋经十三篇》

关注李耶,每天一道面试题,一起卷起来 🔥

相关推荐
XiaoYu1__1 小时前
算法进阶·其一:用SCC、Tarjan算法与缩点思想解决有向图的连通关系及2-SAT问题的拓展
算法
小O的算法实验室1 小时前
AAAI-26,全局相关性学习:通过谱图神经网络增强进化算法
神经网络·学习·算法
段一凡-华北理工大学2 小时前
AI推动工业智能化转型~系列文章07:分类与诊断算法体系:故障识别的完整工具箱
数据库·人工智能·算法·机器学习·分类·数据挖掘·高炉炼铁智能化
简信CRM2 小时前
适合离散制造中小工厂 MES 系统推荐
算法·机器学习·制造
AKA__Zas2 小时前
芝士算法(前缀和2.0)
java·数据结构·算法·leetcode·哈希算法·学习方法
皓月斯语2 小时前
B3867 [GESP202309 三级] 小杨的储蓄 题解
c++·算法·题解
半夢半醒12 小时前
[原创]《C#高级GDI+实战:从零开发一个流程图》第章:增加菱形、平行四边形、圆角矩形,文本居中显示
算法·c#·流程图
Jerry2 小时前
LeetCode 90. 子集 II
算法
机器学习之心3 小时前
CCD实验设计+SVM代理建模+改进NSGA-II工艺参数多目标优化,MATLAB代码
算法·支持向量机·matlab·多目标优化