【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 ...
随机推荐
- [转]Android应用自动更新功能的代码实现
本文转自:http://www.cnblogs.com/coolszy/archive/2012/04/27/2474279.html 由于Android项目开源所致,市面上出现了N多安卓软件市场.为 ...
- VS2015 VB.Net利用QrCodeNet生成QR Code
Step by step Create QR Code with QrCodeNet Step.1 新建項目 Step.2 下載QrCodeNet代碼,解壓\QrCodeNet\sourceCode\ ...
- js作用域及对象以及一些常用技巧
回顾 流程控制(语句) 分支 if () { }if () { } else { }if () { } else if () { } else if () { ...
- mysql命令行执行时不输出列名(字段名)
-N 即可 如:mysql -N -e "select * from test" 摘自:http://blog.csdn.net/eroswang/article/details/ ...
- 简洁js日历控件的使用
往Web工程添加纯js日历控件 在网上找到了DatePicker.js(http://www.cnblogs.com/shenyixin/archive/2013/03/11/2954156.html ...
- PHP开发基础视频教程
PHP现今作为互联网运用很广泛的编程语言,市场需求量也越来越高,而PHP开发工程师的薪资也是一路水涨船高,更多的人看到了PHP的发展前景,纷纷都想投入到PHP的开发大军中来,那么对于很多转行或者零基础 ...
- 单调栈3_水到极致的题 HDOJ4252
A Famous City 题目大意 给出正视图 每一列为楼的高度 最少有几座楼 坑点 楼高度可以为0 代表没有楼 贡献了两发RE 原因 if(!s.empty()&&tem){s. ...
- Web项目之Django基础
Django目录: python项目Django(web服务) python项目Django(HTTP协议) python项目Django(Django的安装与使用) python项目Django(U ...
- 用例重试机制rerunfailures
安装 rerunfailures插件 pip install pytest-rerunfailures 使用: pytest --reruns 重试次数 如:pytest --reruns 2 重 ...
- AppCrawler自动化遍历使用详解(版本2.1.0 )(转)
AppCrawle是自动遍历的app爬虫工具,最大的特点是灵活性,实现:对整个APP的所有可点击元素进行遍历点击. 优点: 1.支持android和iOS, 支持真机和模拟器 2.可通过配置来设定 ...