题目:ZigZag Conversion
解题方法:
以这样的方式画出String更方便看出它的规律。
1 当numRows = 4的时候,第一行和最后一行position每次都是+6.
可以设一个 magicNum = 2 * numRows - 2;
2 再来看,中间的行数(除了第一行和最后一行), position 跳的规律发生变化,其实每次+6(magicNum) 还是存在,只不过中间多了一些char。
规律: 设一个 specialNum = magicNum;
行数每增加一行, specialNum - 2;
每次加完一个char,再加一次char(position=i+specialNum)
举例:
第二行的时候, magicNum = 6; specialNum = 4;
1- Position = 1, A, 加入A.
额外加入(Position + specialNum = 1 + 4 = 5), L, 加入L.
2- Position = Position + magicNum = 1 + 6 = 7, S, 加入S.
额外加入(Position + specialNum = 7 + 4 = 11), I, 加入I.
3- Position = Position + magicNum = 7 + 6 = 13, G, 加入G.
所以第二行加入的是: ALSIG.
代码:
public class Solution
{
public String convert(String s, int numRows)
{
if( s == null || s.length() == 0 || numRows <0)
return "";
if(numRows == 1)
return s;
StringBuilder res = new StringBuilder();
int magicNum = 2*numRows-2;
int specialNum = magicNum;
for(int i=0; i<numRows; i++)
{
for(int j=i; j<s.length(); j+=magicNum)
{
res.append(s.charAt(j));
if(i>0 && i<numRows-1)
{
if(j+specialNum < s.length())
res.append(s.charAt(j+specialNum));
}
}
specialNum -= 2;
}
return res.toString();
}