LeetCode 6. Z 字形变换 | 算法-从菜鸟开始

简介: 本文是《算法-从菜鸟开始》系列文章的第7篇,欢迎收藏、留言、点赞。话不多说,让我们继续我们的算法之旅。

一、LeetCode 6. Z 字形变换


题目介绍:


将一个给定字符串 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);


示例:


输入: s = "PAYPALISHIRING", numRows = 3
输出: "PAHNAPLSIIGYIR"


二、解题分析


这道算法题是非常有意思的,因为大多数的同学在第一次看到的时候根本就弄不明白,这个到底是在干啥。


到底是弄啥类?!


分析这道题时有一个诀窍,就是要把这个题目介绍中的Case当成古代的武林秘籍看,不同于现在文字横写的方式,古代武林秘籍是采用垂直写的方式。


如果换个视角,采用着,一列一列来来看题目,表现为:


  1. 从字符串s中取出一个放入当前行,再次取出一个放入下一行,重复这个行为;


  1. 直到numRows - 1行,放置完成后;


  1. 接下来该调整方向,往上一行放一个;


  1. 继续向上,直到第0行,调整方向,往下一行放一个。


同时要考虑特殊的情况,比如:


  1. 只需要1行时,直接返回字符串即可。


  1. s.length <= numRows即字符串长度小于行数时,也可以直接返回当前字符串。


基于以上的分析,我们来看代码的实现:


/**
 * @param {string} s
 * @param {number} numRows
 * @return {string}
 */
var convert = function(s, numRows) {
  // 特殊Case判定
  if (s.length < numRows || numRows === 1) {
    return s;
  }
  // 定义数组rows,对应存储每一行的字符串
  const rows = []
  // 使用变量i,表示rows的下标,代表了每一行
  let i = 0;
  // 使用变量j,表示字符串s的下标
  let j = 0;
  // 定义当前的填充字符的方向,-1表示向上,1表示向下
  // 注意这里的初始值设置为-1,有特殊作用
  let dir = -1;
  // 遍历字符串,将每一个字符放入到对应的每一行中
  while (j < s.length) {
    // 要注意,对应的每一个i行,都是要拼接上最新的字符。
    // 注意初rows[i]是否存在
    rows[i] = rows[i] ? rows[i] += s[j] : s[j];
    // 调整方向判定条件:第0行以及第numRows - 1行
    if (i === 0 || i === numRows - 1) {
      // 如果调整方向呢,当前值 *= -1即发生反向
      dir *= -1;
    }
    // 当前行数发生变化
    i += dir;
    // 变量j发生变化,继续遍历子串s
    j++;
  }
  // 将数组中的每行字符串再次进行拼接,并返回
  return rows.join('');
};


网络异常,图片无法展示
|


三、总结


整体来看,这道算法题的问题主要集中于如何理解这个Z字型展示的问题,分析展示的特点。得出展示的规律就好理解这个问题了。


当然解决这个问题的算法有很多种,比如去观察每一行字母的下标规律,出现的特点,也是可以计算的。 欢迎大家多多动手尝试。


TIPS:


在JS中,我们经常使用 *= -1的形式,来调整方向,尤其是在动画相关实现中。


算法-从菜鸟开始,而无止境。与君共勉!



相关文章
|
2月前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
41 0
|
29天前
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
|
2月前
|
算法
每日一道算法题(Leetcode 20)
每日一道算法题(Leetcode 20)
29 2
|
4月前
|
算法
测试工程师的技能升级:LeetCode算法挑战与职业成长
这篇文章通过作者亲身体验LeetCode算法题的过程,探讨了测试工程师学习算法的重要性,并强调了算法技能对于测试职业成长的必要性。
76 1
测试工程师的技能升级:LeetCode算法挑战与职业成长
|
4月前
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
54 6
|
4月前
|
存储 算法 Java
LeetCode经典算法题:打家劫舍java详解
LeetCode经典算法题:打家劫舍java详解
70 2
|
4月前
|
人工智能 算法 Java
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
52 1
|
4月前
|
存储 算法 Java
LeetCode经典算法题:预测赢家+香槟塔java解法
LeetCode经典算法题:预测赢家+香槟塔java解法
62 1
|
4月前
|
算法
基于小波变换的图像自适应增强算法
基于小波变换的图像自适应增强算法
18 0
|
8天前
|
算法
基于GA遗传算法的PID控制器参数优化matlab建模与仿真
本项目基于遗传算法(GA)优化PID控制器参数,通过空间状态方程构建控制对象,自定义GA的选择、交叉、变异过程,以提高PID控制性能。与使用通用GA工具箱相比,此方法更灵活、针对性强。MATLAB2022A环境下测试,展示了GA优化前后PID控制效果的显著差异。核心代码实现了遗传算法的迭代优化过程,最终通过适应度函数评估并选择了最优PID参数,显著提升了系统响应速度和稳定性。