问题描述
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)
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”.
解决方案
找到ZigZag每一行的步长规律:第一行和最后一行都只有一种步长;中间的行为两种步长间隔增加
代码
public class ZigZagConversion {
public String convert(String s, int numRows) {
if(s.length() == 0)
return "";
if(numRows==1)
return s;
//get the raw characters array
char[] raw = s.toCharArray();
int length = raw.length;
char[] result = new char[length];
//calculate the steps
int outerStep = 2*numRows-2;
int innerStep_first = 0;
int innerStep_second = 0;
int current = 0;
int pos = 0;
for(int row=0; row < numRows; row++){
if(row==0 || row==numRows-1){ //for the first and last row
pos = row;
while(pos < length){
result[current++] = raw[pos];
pos += outerStep;
}
}else{
innerStep_first = outerStep - row*2;
innerStep_second = outerStep - innerStep_first;
pos = row;
boolean stepSwitch = false; //need to switch innerstep
while(pos < length){
if(!stepSwitch){
result[current++] = raw[pos];
pos += innerStep_first;
stepSwitch = true;
}else{
result[current++] = raw[pos];
pos += innerStep_second;
stepSwitch = false;
}
}
}
}
String r = String.valueOf(result);
return r;
}