Description:
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”.
解析:zigzag一开始我也没太明白是什么意思,google了下才知道。其实就是把字符串原顺序012345678。按如下排列:
rows:3
0 4 8
1357
2 6
rows:4
0 6
1 5 7
24 8
3
然后输出每行的字符,就是最后的结果。
比较简单粗暴的解法,用字符串数组存储每一行,最后拼接就是结果。
code:
public String convert(String s, int numRows) {
if(s==null||s.length()==0)return s;
int len = s.length();
int row = 0;
//用来记录正向还是反向
int index = 1;
String[] result = new String[numRows];
Arrays.fill(result,"");
for(int i=0; i<len; i++)
{
result[row] += s.charAt(i);
row += index;
if(row>=numRows)
{
row =numRows - 2;
index = -1;
}
if(row < 0)
{
row = 1;
index = 1;
}
}
String str = "";
for(int j=0; j<numRows; j++)
{
str +=result[j];
}
return str;
}
高级解法【搬运leetcode】:
Create nRows StringBuffers, and keep collecting characters from original string to corresponding StringBuffer. Just take care of your index to keep them in bound.
public String convert(String s, int nRows) {
char[] c = s.toCharArray();
int len = c.length;
StringBuffer[] sb = new StringBuffer[nRows];
for (int i = 0; i < sb.length; i++) sb[i] = new StringBuffer();
int i = 0;
while (i < len) {
for (int idx = 0; idx < nRows && i < len; idx++) // vertically down
sb[idx].append(c[i++]);
for (int idx = nRows-2; idx >= 1 && i < len; idx--) // obliquely up
sb[idx].append(c[i++]);
}
for (int idx = 1; idx < sb.length; idx++)
sb[0].append(sb[idx]);
return sb[0].toString();
}