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"
.
// P I N
// A LS IG
// Y A H R
// P I
public String convert(String s, int nRows) {
if(nRows <=1) return s;
StringBuilder sb = new StringBuilder();
int len = s.length();
int step = (nRows-1) * 2;
for(int i=0; i<nRows; i++) {
int j = i;
while(j < len) {
sb.append(s.charAt(j));
if(!(i==0 || i==nRows-1)) {
int k = j+ 2*(nRows-i-1);
if(k<len)
sb.append(s.charAt(k));
}
j += step;
}
}
return sb.toString();
}
重构了下代码:
// P I N
// A L S I G
// Y A H R
// P I
public String convert(String s, int numRows) {
if(numRows <= 1) return s;
String res = "";
int n = numRows-1;
for(int i=0; i<numRows; i++) {
int j = i;
while(j < s.length()) {
res += s.charAt(j);
j += (n - j%n)*2;
}
}
return res;
}