【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 ...
随机推荐
- [转]用NPOI操作EXCEL--通过NPOI获得公式的返回值
本文转自:http://www.cnblogs.com/atao/archive/2009/10/12/1582085.html 前面我们学习了通过NPOI向Excel中设置公式,那么有些读者可能会问 ...
- 【转】onAttachedToWindow()在整个Activity生命周期的位置及使用
上篇博客实现圆角对话框样式的Activity中提到,若需实现圆角对话框Activity,需要在Activity的onAttachedToWindow()函数中做文章,那么就想问: onAttached ...
- python部分 + 数据库 + 网络编程
PS:附上我的博客地址,答案中略的部分我的博客都有,直接原标题搜索即可.https://www.cnblogs.com/Roc-Atlantis/ 第一部分 Python基础篇(80题) 为什么学习P ...
- 2017 五一 清北学堂 Day1模拟考试结题报告
预计分数:100+50+50 实际分数:5+50+100 =.= 多重背包 (backpack.cpp/c/pas) (1s/256M) 题目描述 提供一个背包,它最多能负载重量为W的物品. 现在给出 ...
- 如何让局域网其他计算机访问您的Mysql???
一.配置Mysql:(修改mysql数据库中user表) mysql -u root -p // root用户登录mysql>use mysql; // 选择mysql数据库 mysql> ...
- HDU 1964 Pipes (插头DP,变形)
题意:给一个n*m的矩阵,每个格子都是必走的,且无障碍格子,每对格子之间都有一个花费,问哈密顿回路的最小花费. 思路: 这个和Formula1差不多,只是求得是最小花费,这只需要修改一下DP值为花费就 ...
- 使用javap分析Java的字符串操作
我们看这样一行简单的字符串赋值操作的Java代码. String a = "i042416"; 使用命令行将包含了这行代码的Java类反编译查看其字节码: javap -v con ...
- UVA 10735 Euler Circuit (最大流)
题意:求混合图的欧拉路径. 一句话总结:网络流,最主要在于建图,此题是将出度则是和流量联系在了一起,用最大流来调整边的指向. 分析: 这题的困难之处在于无向边只能用一次,相当于一个方向未定的有向边. ...
- k8s 基础概念和术语
Master k8s里的master指的是集群控制节点,每个k8s集群里需要有一个Master节点来负责整个集群的管理和控制,基本k8s所有控制命令都发给它,它负责整个具体的执行过程,后面执行操作基本 ...
- k sum(lintcode)
没通过的代码: class Solution { public: /* * @param A: An integer array * @param k: A positive integer (k & ...