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是什么意思,简单解释一下,就是把字符串原顺序012345……按下图所示排列:
比较直观的解法是,用一个字符串数组 string[rows] 来存储每一行,最后一拼接就是最终结果。
代码如下所示:
public class Solution {
public String convert(String s, int numRows) {
//将字符串转化为字符数组
char[] c = s.toCharArray();
int len = c.length;
//创建numRows个StringBuffer来存放每一行
StringBuffer[] sb = new StringBuffer[numRows];
//initialize the StringBuffer
for(int i=0;i<sb.length;i++){
sb[i]=new StringBuffer();
}
int j=0;
while(j<len){
//从上到下处理垂直方向
for(int k=0;k<numRows&&j<len;k++){
sb[k].append(c[j++]);
}
//从下往上处理斜线方向
for(int k=numRows-2;k>=1&&j<len;k--){
sb[k].append(c[j++]);
}
}
//将numsRows个StringBuffer拼接到一起
for(int k=1;k<sb.length;k++){
sb[0].append(sb[k]);
}
return sb[0].toString();
}
}