[模拟|字符串] leetcode 6 Z字形变换

1.题目

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

L   C   I   R
E T O E S I I G
E   D   H   N

之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“LCIRETOESIIGEDHN”。
示例1:

输入: s = "LEETCODEISHIRING", numRows = 3
输出: "LCIRETOESIIGEDHN"

示例2:

输入: s = "LEETCODEISHIRING", numRows = 4
输出: "LDREOEIIECIHNTSG"
解释:
L     D     R
E   O E   I I
E C   I H   N
T     S     G

2.分析

2.1.结果存储

输入给出的是一维的顺序字符串,而输出的字符串是建立在“Z字型”这样一个二维结构上的。因此可以首先考虑建立一个二维数组来存储这个Z字形结构。
由于字符串本质上是一个一维的字符数组,因此我们建立一个字符串数组便可以模拟这一二维结构:

string convert(string s, int numRows) {if (numRows == 1) {  //输出也是一行的话则直接返回原字符串return s;}//行数比字符串长度大的话,实际上只有一列vector<string> rows(min(numRows, int(s.size())));//......
}

2.2.遍历顺序

“Z字型”(或者看起来更像"N字型")遍历,本质上是先往下,再往上,再往下…因此我们需要判断好什么时候调整遍历的方向。
而只有在两种情况下需要调整方向:遍历到第0行(方向需调整至向下),遍历到最后一行(方向需调整至向上)。

int curRow = 0;  //当前行
bool goingDown = false;  //是否向下
for (char c : s) {rows[curRow] += c;  //将该字符存入对应的结果行中if (curRow == 0 || curRow == numRows - 1) {  //反向goingDown = !goingDown;}curRow += goingDown ? 1 : -1; //根据方向调整行数
}

实际上本题到这里就几乎做完了。以示例2为例,表面上我们要存储的输出为:

L     D     R
E   O E   I I
E C   I H   N
T     S     G

实际上存储的是:

L D R
E O E I I
E C I H N
T S G

按行展开后依然为LDREOEIIECIHNTSG,因为我们并不关心每行之间的空格。

3.代码

class Solution {public:string convert(string s, int numRows) {//输出也是一行的话则直接返回原字符串if (numRows == 1) {  return s;}//行数比字符串长度大的话,实际上只有一列vector<string> rows(min(numRows, int(s.size())));int curRow = 0;//当前行bool goingDown = false;//是否向下for (char c : s) {rows[curRow] += c;//将该字符存入对应的结果行中if (curRow == 0 || curRow == numRows - 1) {//反向goingDown = !goingDown;}curRow += goingDown ? 1 : -1;//根据方向调整行数}string res;for (string row : rows) {res += row;}return res;}
};

[模拟|字符串] leetcode 6 Z字形变换相关推荐

  1. LeetCode 6.z字形变换

    LeetCode 6.z字形变换 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时, ...

  2. Java实现 LeetCode 6 Z字形变换

    6. Z 字形变换 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L ...

  3. LeetCode 6 Z字形变换

    将字符串 "PAYPALISHIRING" 以Z字形排列成给定的行数: P A H N A P L S I I G Y I R 之后从左往右,逐行读取字符:"PAHNAP ...

  4. LeetCode——6. Z 字形变换

    6. Z 字形变换(中等难度) 题目描述: 将一个给定字符串 s 根据给定的行数 numRows ,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "PAYPALISHIRING ...

  5. LeetCode 6. Z 字形变换(找规律)

    1. 题目 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L C I ...

  6. Leetcode 006. Z 字形变换 | 每日一题

    题目描述: 将一个给定字符串根据给定的行数,以从上往下.从左到右进行Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L C I ...

  7. Leetcode 6.Z 字形变换 (每日一题 20210630)

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

  8. leetcode —— 6. Z 字形变换

    将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L C I R E T ...

  9. LeetCode 6. Z 字形变换 (N字形变换)

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

最新文章

  1. Linux堆内存管理深入分析
  2. android 图片放大缩小 多点触摸,Android 多点触摸(图片放大缩小)
  3. boost::mp11::mp_join相关用法的测试程序
  4. 元素或为1或为-1的行列式的值的估计
  5. 使用eclipse svn塔建(配置)时的一点点心得
  6. 离散元 python_离散元在土木工程领域的应用前景如何?
  7. Java this添加窗口,如何使一个窗口,看起来像这样在Java中? (How to make a window look like this in Java?)...
  8. jquery.lazyload 插件实现图片延迟加载
  9. 平衡二叉树的判定(LeetCode 110)
  10. %02 java_Java基础02—变量、运算符和数据类型转换(示例代码)
  11. Lync Server 2013 实战系列之二:标准版-前期准备
  12. 网站服务器怎么查ipv4,服务器的ipv4地址怎么查
  13. 用python爬取之后发现果然如此,都说知乎的小姐姐漂亮
  14. 数据库安全性相关习题。
  15. Vscode配置C++(一步一步图文详解)
  16. window10下的VS2019环境变量配置教程
  17. android storage 路径,风儿带你了解Android存储路径。
  18. python实现1/n倍频程计算
  19. EC11旋转编码器驱动程序
  20. 88句名言,很深刻的

热门文章

  1. android rsa解密前面带乱码,C#rsa解密的解出来的结果乱码
  2. python中yield的使用(两分钟读懂)
  3. 用python自动化玩游戏封号吗_用 Python 自动化办公能做到哪些有趣或有用的事情?...
  4. vue怎么根据id获取组件_vue子组件,如何根据父组件传进来的id,去查询详情,并在子组件中显示?...
  5. 力扣 496 下一个更大的元素I
  6. root启动php报错,php使用root用户启动
  7. 操作系统 第二章 进程管理
  8. 保存一个 Python 对象,之后使用时直接读取
  9. Java实验4 面向对象基础
  10. 词汇表生成(C语言)