题目: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 N
A P L S I I G
Y 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”.
原题链接: http://oj.leetcode.com/problems/zigzag-conversion/
思路:
附上一张比较清晰的ZigZag的遍历顺序:
numRows为总行数,i为所在行数。由图可知,每行最左和最右两个数值之差为2(numRows-1)。除了第一行和最后一行,中间行的中间元素到该行下一个元素的差值为2*i。因此中间元素到最左边元素的差值为2(numRows-1)-2i。
注:
- 边界条件:当字符串为空或是字符串长度小于行数。
- 使用了Java的StringBuilder类,是可变字符序列。
下面附上已经submit的代码:
public class Solution{
public String convert(String s,int numRows){
//考虑边界情况
if (s == null || s.isEmpty())
{
return s;
}
int length = s.length();
if(length <= numRows || numRows == 1 )
{
return s;
}
//StringBuilder是可变字符序列
StringBuilder res = new StringBuilder();
int step = 2 * (numRows - 1);
for(int i = 0;i < numRows;i++)
{
int interval = step - 2*i;
for(int j=i;j<length;j+=step)
{
res.append(s.charAt(j));
//除了第一行和最后一行
if(i!=0 && i!= numRows - 1)
{
int temp = j + step - 2i;
if(temp<s.length))
//append方法始终将这些字符添加到缓冲区的末端;
res.append(s.charAt(temp));
}
}
}
return res.toString();
}
}