题目:
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 RAnd 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"
.
解题思路:
根据每一行的字符的索引与间隔之间的关系,例如nRows等于3的时候,那么排成之字形之后,
第一行的字母索引除以间隔4,余数都是0。第二行余数都是1或者是3,第三行余数是2。发现关系之后,
就遍历字符串,把每个字符填入所在行的队列中,最后把每一行的字符串连接一下就可以了。
代码:
public String convert(String s, int nRows) {
int n = s.length();
int step = 2 * nRows - 2;
if(step==0)//如果nRows为1,那么直接返回原始字符串
return s;
StringBuffer result = new StringBuffer();
StringBuffer resultRows[] = new StringBuffer[nRows];
for (int i = 0; i < nRows; i++) {
resultRows[i] = new StringBuffer();
}
for (int i = 0; i < nRows; i++) {
for (int j = 0; j < n; j++) {
if ((j % step == i) || ((j % step + i) % step == 0))
resultRows[i].append(s.charAt(j));
}
}
for (int i = 0; i < nRows; i++) {
result.append(resultRows[i]);
}
return result.toString();
}