【LeetCode】6.ZigZag Conversion N型排列问题
2016-03-23 15:09
447 查看
题目:
The string
![](http://img.blog.csdn.net/20160323141942175?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
And then read line by line:
Write the code that will take a string and make this conversion given a number of rows:
![](http://img.blog.csdn.net/20160323142035004?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
理解:
给定一个字符串,将其按照N型排列后,输出按照每一行读取的结果。
分析:
题目中给定的例子并不能很好地解释题目的意思,仍以上面的例子为例,若给定nRows=4,按照N型排列后应该是下面的形状:
![](http://img.blog.csdn.net/20160323144654695?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
返回的结果应该是:PINALSIGYAHRPI 。
若将字符换成它在字符串中的下标,就可以找出一定规律,扫描一遍字符串,便可以得出结果。下标表示如下:
![](http://img.blog.csdn.net/20160323145202608?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](http://img.blog.csdn.net/20160323144634429?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
(nRows=3) (nRows=4)
我的做法是可以将字符串按照下面的方式分组,N型排列后的字符串总是按照组的形状重复,除了最后一组可能不是一个完整的组。显然,每一组字符的个数为(nRows+nRows-2) :
![](http://img.blog.csdn.net/20160323145507315?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](http://img.blog.csdn.net/20160323145536394?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
(nRows=3) (nRows=4)
第i个字符在它所在组中的顺序可以用 i%(nRows+nRows-2) 表示。可以用一个大小为nRows的字符数组string strs[nRows]来存储每一行的字符,strs[j]即存储排列后第j行的字符,那么这个问题就转化为根据下标将字符放到相应行的string中,最后按顺序将nRows个string连接起来返回最终结果。字符下标与它所在的行有下面这样的规律:
(1)若 i%(nRows+nRows-2)<nRows,s[i]在i%(nRows+nRows-2)行;
(2)若 i%(nRows+nRows-2)>nRows,s[i]在s[i-1]的上一行。
根据这个规律,便可以得到正确结果。需要注意的是(nRows+nRows-2)<=0的情况。
代码:
The string
"PAYPALISHIRING"is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility).
And then read line by line:
"PAHNAPLSIIGYIR".
Write the code that will take a string and make this conversion given a number of rows:
convert("PAYPALISHIRING", 3)should return
"PAHNAPLSIIGYIR".
理解:
给定一个字符串,将其按照N型排列后,输出按照每一行读取的结果。
分析:
题目中给定的例子并不能很好地解释题目的意思,仍以上面的例子为例,若给定nRows=4,按照N型排列后应该是下面的形状:
返回的结果应该是:PINALSIGYAHRPI 。
若将字符换成它在字符串中的下标,就可以找出一定规律,扫描一遍字符串,便可以得出结果。下标表示如下:
(nRows=3) (nRows=4)
我的做法是可以将字符串按照下面的方式分组,N型排列后的字符串总是按照组的形状重复,除了最后一组可能不是一个完整的组。显然,每一组字符的个数为(nRows+nRows-2) :
(nRows=3) (nRows=4)
第i个字符在它所在组中的顺序可以用 i%(nRows+nRows-2) 表示。可以用一个大小为nRows的字符数组string strs[nRows]来存储每一行的字符,strs[j]即存储排列后第j行的字符,那么这个问题就转化为根据下标将字符放到相应行的string中,最后按顺序将nRows个string连接起来返回最终结果。字符下标与它所在的行有下面这样的规律:
(1)若 i%(nRows+nRows-2)<nRows,s[i]在i%(nRows+nRows-2)行;
(2)若 i%(nRows+nRows-2)>nRows,s[i]在s[i-1]的上一行。
根据这个规律,便可以得到正确结果。需要注意的是(nRows+nRows-2)<=0的情况。
代码:
class Solution { public: string convert(string s, int numRows) { int n=2*numRows-2; if(n<=0) return s; string strs[numRows]; for(int i=0;i<numRows;i++) strs[i]=""; int lastRow; for(int i=0;i<s.length();i++) { int temp=i%n; if(temp<numRows) { strs[temp]+=s[i]; lastRow=temp; } else { strs[--lastRow]+=s[i]; } } string result=""; for(int i=0;i<numRows;i++) { result+=strs[i]; } return result; } };
相关文章推荐
- hibernate抓取策略fetch具体解释
- Oracle 创建 DBLink 的方法
- IOS 开发创建xib文件并且与视图控制器绑定
- PHP和JS实现多按钮提交表单
- 域渗透的金之钥匙
- C-二级指针输出模型练习
- Android内存泄漏
- 使用illuminate/html
- 在vs2010上配置FlyCapture
- Hadoop MapReduce容错性分析
- 泛型(一)(浅层介绍---好处)
- 当下的云计算浅谈
- 安装SQLserver的注意事项
- AFNetworking的实现原理
- android 系统版本信息工具类 获取设备型号 设置屏幕亮度 软键盘 获取屏幕高度宽度
- easyUI Layout自适应窗口大小
- EF Profiler 查看跟踪Entity Framework SQL 语句
- iOS UIView的几个layout方法-layoutSubviews、layoutIfNeeded、setNeedsLayout
- 不要暴露.git
- 在Global.asax文件里实现通用防SQL注入漏洞程序(适应于post/get请求)