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"
.
题意是:给你一个字符串,他是以Z形式表示出来的字符串顺序,然后你以行的形式读出来。给定了字符串的行数。
解题思路:我们发现第一行和最后一行都很好处理,就是每次读取j+2*nRows-2,就是中间的行则需要单独处理。
正如以上的例子,我们发现,我们可以每次选区PAYP作为一个单元处理。就是选取nRows+nRows-2=2nRows-2个长度处理。
那么中间元素的位置关系是j+2*nRows-2i-2(i表示第几行)
ok,代码如下:
public String convert(String s, int nRows)
{
if (s == null || nRows == 1)
return s;
int len = s.length();
if (len <= nRows)
return s;
StringBuffer res = new StringBuffer();
int size = 2 * nRows - 2;//每次处理的长度
for (int i = 0; i < nRows; i++) {//每一行的元素
char ch;
for (int j = i; j < len; j += size) {
ch = s.charAt(j);
res.append(ch);
if (i != 0 && i != nRows - 1) {//如果是中间元素单独处理
int tmp = j + size - 2 * i;
if (tmp < len) {
ch = s.charAt(tmp);
res.append(ch);
}
}
}
}
return res.toString();
}