算法六Z自形变换
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 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自形变换的更多相关文章
- leetcode刷题六<z字形变换>
将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 时,排列如下: L C I R E T O E S I I G E D H N 之后,你的输出需要从左往右逐 ...
- 算法题--Z字形变换
题目描述 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L C I ...
- 算法题-Z 字形变换
描述 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L C I R ...
- PHP算法之Z 字形变换
将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L C I RE T ...
- Java算法练习—— Z 字形变换
题目链接 题目描述 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L ...
- [LeetCode] Z字型变换
题目内容: 将字符串 "PAYPALISHIRING" 以Z字形排列成给定的行数: P A H N A P L S I I G Y I R 之后从左往右,逐行读取字符:" ...
- 莫队算法-小Z的袜子
小Z的妹子袜子这道题用的是莫队算法,据说解决离线区间询问几乎无敌. 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于 ...
- 算法:Z字型(Zigzag)编排
问题:给定 n 行和 m 列的二维数组矩阵.如图所示,以 ZIG-ZAG 方式打印此矩阵. 从对称的角度来看,通过反复施加滑行反射可以从简单的图案如线段产生规则的之字形. 主要思想:算法从(0, 0) ...
- 「算法笔记」快速数论变换(NTT)
一.简介 前置知识:多项式乘法与 FFT. FFT 涉及大量 double 类型数据操作和 \(\sin,\cos\) 运算,会产生误差.快速数论变换(Number Theoretic Transfo ...
随机推荐
- Python ASCII码与字符相互转换
ASCII ((American Standard Code for Information Interchange): 美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和 ...
- 前端优化,包括css,jss,img,cookie
前端优化,来自某懒观看麦子学院视频的笔记. 尽可能减少HTTP的请求数 使用CDN 添加Expirs头,或者Cache-control Gzip组件压缩文件内容 将CSS放在页面上方 将脚本放到页面下 ...
- WPF 使用SetParent嵌套窗口
有点类似与Winform的MDI窗口. 使用函数为SetParent和MoveWindow(经常配合). [DllImport("user32.dll", SetLastError ...
- docker registry 删除镜像 垃圾回收
操作步骤 通过环境变量修改默认配置,允许删除 获取image的sha值 进入registry容器中,执行垃圾回收 删除残留目录 #环境变量 REGISTRY_STORAGE_DELETE_ENABLE ...
- Web前端——Html常用标签及属性
html 常用的标题等标签就不记录了,只记录一下比较少见的标签以及属性 表格 table td 单元格 tr 表的行 th 表头 td或th可以下面的两个属性达到跨行或跨列 表格跨行 rowspan ...
- 屏幕输入转换为int//方法大注释
可以使用两种方法: using System; namespace 方法测试 { class Program { static void Main(string[] args) { Console.W ...
- Java生鲜电商平台-B2B生鲜的互联网思维
Java生鲜电商平台-B2B生鲜的互联网思维 在互联网高速发展的今天,为我们的生活带来了众多便利.然而互联网从早期的萌芽状态到现在妇孺皆知,它的崛起速度远远超乎世人的想象.人们开始关注互联网并且研究它 ...
- centos下搭建python双版本环境
目录 centos下搭建python双版本环境 一.安装python3 1.理清自带python位置 2.更新用于下载编译python3的相关包 3.安装pip 4.用pip安装wget 5.用wge ...
- JS基础语法---for循环遍历数组
for循环遍历数组 要显示数组中的每个数据,可以如下: var arr=[10,20,30,40,50]; //显示数组中的每个数据 console.log(arr[0]); console.log( ...
- 函数截流---js
<div id="show">0</div> <button id="btn">click</button> & ...