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"
解:
P A Y P A L I S H I R I N G
0 1 2 3 4 5 6 7 8 9 1011 1213
public String convert(String s, int numRows) {
if(numRows == 1) return s;
StringBuilder sb = new StringBuilder(s.length());
int partLen = 2*numRows - 2;
//PIN
for(int j = 0; j < s.length(); j += partLen){
sb.append(s.charAt(j));
}
int t = 0;
for(int i = 2;i <= numRows - 1; i ++){
t ++;
for(int j = i-1,q = partLen; j < s.length();q+=partLen,j += partLen){
sb.append(s.charAt(j));
if(q-t < s.length()){
sb.append(s.charAt(q-t));
}
}
}
//PI
for(int j = numRows-1; j < s.length(); j += partLen){
sb.append(s.charAt(j));
}
return sb.toString();
}