题目:
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"
.
第0行和最后一行中,前一个下标的值和后一个下标的值相差(numRows-1)*2,
其余行也是相差(numRows-1)*2,只是在每两个元素中间还有一个元素,如上面的P,S等,
这些元素的位置是 前一个元素位置+(numRows - i - 1) * 2。
public static String convert(String s, int numRows) {
if (s == null || s.length() <= numRows || numRows <= 1) return s;
StringBuffer sb = new StringBuffer();
// the first row,每一个元素相隔 (numRows-1)*2
for (int i = 0; i < s.length(); i += (numRows - 1) * 2)
sb.append(s.charAt(i));
for (int i = 1; i < numRows - 1; i++) {
for (int j = i; j < s.length(); j+= (numRows - 1) * 2) {
sb.append(s.charAt(j));
if (j + (numRows - i - 1) * 2 < s.length())
sb.append(s.charAt(j + (numRows - i - 1) * 2));
}
}
// the last row
for (int i = numRows - 1; i < s.length(); i += (numRows - 1) * 2)
sb.append(s.charAt(i));
return sb.toString();
}