Leetcode 6 ZigZag Conversion
来源:互联网 发布:死神方便知乎 编辑:程序博客网 时间:2024/06/04 19:20
ZigZag Conversion
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)
P A H NA P L S I I GY I R
And then read line by line: “PAHNAPLSIIGYIR”
Write the code that will take a string and make this conversion given a number of rows:
string convert(string text, int nRows);
convert(“PAYPALISHIRING”, 3) should return “PAHNAPLSIIGYIR”.
Solution1
- 这种解法没什么诀窍,无非是注意一些边界条件。我在这里用一个StringBuffer数组来模拟每一行,然后针对原始字符串进行遍历,在StringBuffer数组上去模拟之字形走路线,这里需要注意的是,每到之字形的末尾和之字形的头部的时候,便需要转向。这里用一个flag来标志每次转向的方向,代码如下:
public class Solution { public String convert(String s, int numRows) { if(numRows<=1) return s; StringBuffer[] sbs = new StringBuffer[numRows]; for(int i=0;i<numRows;i++) sbs[i] = new StringBuffer();//注意必须在创建StringBuffer数组后针对每一个去new一个出来,不然初始值都是null boolean flag = false; for(int i=0,j=0;i<s.length();i++){ char c = s.charAt(i); sbs[j].append(c); if(!flag&&j==numRows-1) flag = true;//到达末尾了,从后往前转向 if(flag&&j==0) flag = false;//到达头部了,从头往后转向 if(flag) j--; else j++; } StringBuffer result = new StringBuffer(); for(StringBuffer sb:sbs) result.append(sb); return result.toString(); }}
Solution2
- 解法1用到了一个StringBuffer数组,实际上这个数组是多余的,完全不用先去得到每行的字符串后再最后才去合并成一个字符串。可以将字符串分割成每一小段,在这每一小段里都可以有一定的规律。代码如下:
if(numRows<=1||s.length()==0) return s; StringBuffer sb = new StringBuffer(); int step = 2*numRows - 2;//将字符串分割成一段一段 for(int i=0;i<numRows;i++){ if(i==0||i==numRows-1){//当i在首行和末尾行时,直接将相隔step个间隔的字符组成各自行。 for(int j=i;j<s.length();j+=step) sb.append(s.charAt(j)); continue; } for(int j=i;j<s.length();j+=step){//注意j+=step,所以也是将原始字符串每相隔step个间隔来进行考虑。 sb.append(s.charAt(j)); if(j+step-2*i<s.length()) sb.append(s.charAt(j+step-2*i));//在每一个step区间段内部,还有另外一个相隔(step-2*i)的一个字符也添加进来。 } } return sb.toString();
- 解法2相比解法1的空间使用更加节省,但实际的空间复杂度并没有变。时间复杂度和空间复杂度都为O(
N )
0 0
- LeetCode 6 - ZigZag Conversion
- LeetCode 6: ZigZag Conversion
- LeetCode(6)ZigZag Conversion
- Leetcode【6】:ZigZag Conversion
- [leetcode 6] ZigZag Conversion
- LeetCode 6 ZigZag Conversion
- LeetCode(6) ZigZag Conversion
- [Leetcode] 6 - ZigZag Conversion
- LeetCode 6:《ZigZag Conversion》
- [leetcode 6] ZigZag Conversion
- LeetCode | #6 ZigZag Conversion
- [leetcode] 6 ZigZag Conversion
- leetCode #6 ZigZag Conversion
- leetcode 6 ZigZag Conversion
- leetcode-6 ZigZag Conversion
- leetcode 6 ZigZag Conversion
- LeetCode 6 - ZigZag Conversion
- leetcode 6ZigZag Conversion
- MySQL出现“错误1067:进程意外终止”
- 股票学习(技术指标)
- 判断回文数
- [LeetCode]Evaluate Reverse Polish Notation
- 随机收缩算法
- Leetcode 6 ZigZag Conversion
- Bootstrap全局CSS样式之栅格系统
- 数据库.创建表
- Visual Studio 2015 社区版.专业版.企业版[含安装密钥Pro&Ent]
- 杭电 HDU ACM 2795 Billboard(线段树伪装版)
- 第三天学习笔记2
- 03-类加载器
- D - Data Center-2014-2015 ACM-ICPC, NEERC, Southern Subregional Contest
- onCreateOptionsMenu 到 NullPointerException 的结果