【LeetCode】ZigZag Conversion(Z 字形变换)
这道题是LeetCode里的第6道题。
题目要求:
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 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
题目虽然很长,但是题目本身并不难,却相当的花时间。这道题l类似于我之前做过的螺旋矩阵(回形取数),打打草稿发现规律,找出函数关系就行了。
拿例子2说明:
输入:s = “LEETCODEISHIRING”,numRows = 4
Z字排列如下:
转换成对应的下标索引为:
首先可以发现第一行的索引添加量和Z字的行数numRows有关系:IndexAdd=2*numRows-2
例如当 numRows = 3 时:
IndexAdd=2*3-2=4
根据这个特性首先可以解决第一行,同理解决最后一行。
解决完首尾行后中间行怎么办呢?因为中间行有斜对角的字符,要如何处理?其实不难,拿例子2来说,第二行1和7中间一个,7和13中间一个,第三行2和8中间一个,8和14中间一个,也就是说中间行每隔 IndexAdd 就会有一个字符,前提是不超出范围。numRows = 3 时,中间第二行也符合这个规律。而且这些字符还符合另一规律:例子2中5在 i=1 行(索引值),1和5差4,4在 i=2行(索引值),2和4差2。也就是说中间字符和左边字符的差值为 IndexAdd-2*i,所以中间行这样处理:第一个是 j=i,然后中间字符 j=j+IndexAdd-2*i,再是 j=j+2*i,这样走完一轮相当于 j=j+IndexAdd,一直循环。
说明:i 是行的索引值,不是第 i 行。第一行的索引值为0,第二行的索引值为1,等等。
提交代码:
class Solution {
public:
string convert(string s, int numRows) {
int i=0,j,len=s.length(),IndexAdd=(numRows-1)*2;
if(numRows==1||numRows>=s.length())return s;
string res;
while(1){
j=i;
if(i==0||i==numRows-1){
while(j<len){res+=s[j];j=j+IndexAdd;}
i++;
if(i==numRows)break;
}else{
while(j<len){res+=s[j];j=j+IndexAdd-2*i;
if(j<len){res+=s[j];j=j+2*i;}}
i++;
}
}
return res;
}
};
提交结果:

个人总结:
题目不难只要发现其中规律就能很好的解决。一开始处理的时候弄混淆了下标和字符的关系,浪费了些时间。
【LeetCode】ZigZag Conversion(Z 字形变换)的更多相关文章
- 【LeetCode】6. ZigZag Conversion Z 字形变换
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 公众号:负雪明烛 本文关键词:字形变换,ZigZag,题解,Leetcode, 力扣,P ...
- LeetCode Golang 6. Z 字形变换
6. Z 字形变换 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L ...
- 【LeetCode】6. Z 字形变换
题目 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L C ...
- 【LeetCode 6】Z 字形变换
题目链接 [题解] 还想着模拟这个过程.然后发现只有行有用啊!... 那就建个rows大小的字符串数组存每行从左到右的字符就行啦.. 然后就是i从1变到n然后又变回1反复就好了. 最后把1..rows ...
- C#版[击败100.00%的提交] - Leetcode 6. Z字形变换 - 题解
版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...
- Z 字形变换 C++实现 java实现 leetcode系列(六)
Z 字形变换 java实现 C++实现 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 ...
- Leetcode(6)Z字形变换
Leetcode(6)Z字形变换 [题目表述]: 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" ...
- Java实现 LeetCode 6 Z字形变换
6. Z 字形变换 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L ...
- Leetcode题库——6.Z字形变换
@author: ZZQ @software: PyCharm @file: convert.py @time: 2018/9/20 20:12 要求: Z字形变换 将字符串 "PAYPAL ...
随机推荐
- ios调用Html内JS alert 不能点击关闭为甚?
ios调用Html内JS alert 不能点击关闭为甚? This question gave me the most insight to the problem... Deadlock with ...
- win10下vs2013为程序集新建强名称文件时“未能完成操作。拒绝访问”的解决方案
昨日,在使用vs2013开发开发一个小工具,打算给这个小工具的源代码进行保护. 在输入完成建立强名称密钥文件时,爆出了如下错误: 一开始以为是项目所在路径的权限问题,于是给项目所在路径文件夹添加了“U ...
- (六)mybatis之构建SqlSessionFactory
构建SqlSessionFactory 每个mybatis应用都是以SqlSessionFactory的实例为中心的.SqlSessionFactory的实例可以通过SqlSessionFactory ...
- UVA 12549 Sentry Robots (最小点覆盖)
这道题挺像hdu 5093 Battle ships的,不过那道题是要求最多放置的点数,而这道题是要求最小点覆盖. 顶点覆盖的定义是:在G中任意边至少有一个端点属于顶点集合S. 一个重要的位置有(x, ...
- python 1:列表和字典
初学Python, 对列表和字典的嵌套使用. phoneBook = [] #列表 list peopleInfo = {} #字典 dict i=0 while i<3: peopleInfo ...
- gcc, g++ - GNU 工程的 C 和 C++ 编译器 (egcs-1.1.2)
总览 (SYNOPSIS) gcc [ option | filename ]... g++ [ option | filename ]... 警告 (WARNING) 本手册页 内容 摘自 GNU ...
- k8s 创建资源的两种方式【转】
命令 vs 配置文件 Kubernetes 支持两种方式创建资源: 1. 用 kubectl 命令直接创建,比如: kubectl run nginx-deployment --image=nginx ...
- linux or msys2设置网络代理
在文件 .bashrc 中添加 export http_proxy="proxy IP:port" 如 export http_proxy="192.168.0.1:80 ...
- mysql 特定查询条件下导致的大海捞针
order表: order type gmt_create type 取值: 0,1 其中0非常多,1非常少. 当查询条件里 select * from order where type=0 an ...
- ios retain copy 以及copy协议
阅读本文之前首先了解Copy与Retain的区别: Copy是创建一个新对象,Retain是创建一个指针,引用对象计数加1. Copy属性表示两个对象内容相同,新的对象retain为1 ,与旧有对象的 ...