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

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

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

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

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

string convert(string s, int numRows);

示例 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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zigzag-conversion
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题目看了半天,看到评论说这是N字形变换,才突然明白说的什么。给定字符串,然后按照类似于波浪一样反的N字排序,N的高度给定,然后把排序好的字符再按照横向一行行的读取出来。

找规律,这道题有很明显的规律,按照V的形式循环,每个V的字母个数是2 * numRows - 2,因为是V,所以是两排高度,每个高度是numRows,所以是2 * numRows,因为V最底端转折的字母只需一个就够了,所以减1,V最后一个字母要算到下一个V,所以再减一。

这样每一行的字母位置相对于V开头的字母索引是固定的,所以按照V的跳度遍历,计算每一行的字母。

    string tmp;
if (numRows > && !s.empty())
{
for (int i = ; i < numRows; i++)
{
for (int j = ; j < s.size(); j = j + (numRows * - ))
{
if (j + i < s.size())
{
tmp.push_back(s[j + i]);
}
if ((numRows - - i) * < (numRows * - ) && i != numRows - && (j + numRows - + numRows - - i < s.size()))
{
tmp.push_back(s[j + numRows - + numRows - - i]);
}
}
}
}
else
{
tmp = s;
} return tmp;

考虑到tmp在不断的push_back,导致内存存在申请释放的问题,所以进行修改,一次性把内存申请完

string convert(string s, int numRows) {
string tmp = s;
int tmpi = ;
if (numRows > && !s.empty())
{
for (int i = ; i < numRows; i++)
{
for (int j = ; j < s.size(); j = j + (numRows * - ))
{
if (j + i < s.size())
{
tmp[tmpi] = s[j + i];
tmpi++;
}
if ((numRows - - i) * < (numRows * - ) && i != numRows - && (j + numRows - + numRows - - i < s.size()))
{
tmp[tmpi] = s[j + numRows - + numRows - - i];
tmpi++;
}
}
}
} return tmp;
}

坑一,在所有的字符访问的地方都需要注意判断是不是会超过s的长度,避免越界。

评论解一,除了上面的方法,还有另一种方法,就是根据字符串N字排序的步骤,一个个的计算。声明一个字符串数组,每一个元素表示变换后这一行的字母,那么从0开始,每次增加一行,把元素放到当前行对应的字符串数组最后,到达最底端或是最顶端的时候,字符串数组的索引就从递增或是递减变成相反的方向继续。这种效率与上面差不多,也很好理解,并且比较巧妙。

算法六Z自形变换的更多相关文章

  1. leetcode刷题六<z字形变换>

    将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 时,排列如下: L C I R E T O E S I I G E D H N 之后,你的输出需要从左往右逐 ...

  2. 算法题--Z字形变换

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

  3. 算法题-Z 字形变换

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

  4. PHP算法之Z 字形变换

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

  5. Java算法练习—— Z 字形变换

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

  6. [LeetCode] Z字型变换

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

  7. 莫队算法-小Z的袜子

    小Z的妹子袜子这道题用的是莫队算法,据说解决离线区间询问几乎无敌. 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于 ...

  8. 算法:Z字型(Zigzag)编排

    问题:给定 n 行和 m 列的二维数组矩阵.如图所示,以 ZIG-ZAG 方式打印此矩阵. 从对称的角度来看,通过反复施加滑行反射可以从简单的图案如线段产生规则的之字形. 主要思想:算法从(0, 0) ...

  9. 「算法笔记」快速数论变换(NTT)

    一.简介 前置知识:多项式乘法与 FFT. FFT 涉及大量 double 类型数据操作和 \(\sin,\cos\) 运算,会产生误差.快速数论变换(Number Theoretic Transfo ...

随机推荐

  1. Redis高可用集群-哨兵模式(Redis-Sentinel)

     前言 Redis哨兵模式,用现在流行的话可以说就是一个“哨兵机器人”,给“哨兵机器人”进行相应的配置之后,这个"机器人"可以7*24小时工作,它能能够自动帮助你做一些事情,如监控 ...

  2. Flink on Yarn的两种模式及HA

    转自:https://blog.csdn.net/a_drjiaoda/article/details/88203323 Flink on Yarn模式部署始末:Flink的Standalone和on ...

  3. 【shell脚本】一键部署LNMP===deploy.sh

    一键部署mysql,php,nginx,通过源码安装部署 #!/bin/bash # 一键部署 LNMP(源码安装版本) menu() { clear echo " ############ ...

  4. spring的事件机制实战

    理论 在分布式场景下,实现同步转异步的方式有三种方式: 1.异步线程池执行:比如借助@Asyn注解,放到spring自带的线程池中去执行: 2.放到消息队列中,在消费者的代码中异步的消费,执行相关的逻 ...

  5. vscode打开文件在同一个tab的问题

    当我们单击或者 cmd+鼠标左键单击打开文件时,有时候是在同一个窗口,有时候是新的窗口,这是啥样呢?   这是因为vscode有 "预览模式" , 当是预览模式时,打开的是当前窗口 ...

  6. 关于WIN7下IE8IE7浏览器无法安装微信支付商户证书的解决方案

    关于WIN7下IE8IE7浏览器无法安装微信支付商户证书的解决方案 解决方案就是使用 chrome浏览器 默认的chorme浏览器  打开微信商户平台 会提示让安装控件  然后反复安装 其实要解决这个 ...

  7. java高并发系列 - 第5天:深入理解进程和线程

    进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.程序是指令.数据及其组织形式的描述,进程是程序的实体. 进程具有的 ...

  8. 2018-2-13-win10-uwp-手动锁Bitlocker

    原文:2018-2-13-win10-uwp-手动锁Bitlocker title author date CreateTime categories win10 uwp 手动锁Bitlocker l ...

  9. C#如何用IL和Emit类通过Calli来实现实例函数与静态函数的调用

    一. 介绍 最近充能看书,在书上看到函数调用可以 " 通过 ldftn 获得函数指针,然后使用 calli 指令 " 来进行调用,并说这种行为 " 类似 C 的函数指针, ...

  10. elasticsearch window下配置安装

    1.首先下载elasticsearch 下载链接:https://www.elastic.co/cn/downloads/elasticsearch 第一张图是下载的,第二章图是下载msi的程序,直接 ...