问题描述:
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”.
分析:row从0到numRow,然后对于每一行而言,从该处开始,读取一个gap之外的数据。重复下去
代码如下:396ms,时间复杂度为O(n)
public class Solution {
public String convert(String s, int numRows) {
if(numRows==1)
return s;
else if(numRows>=s.length())
return s;
char[] res = new char[s.length()];
int resIndex = 0;
int gap = numRows*2-2;
int gap2;
int index;
boolean down;
boolean up ;
for(int i = 0;i<numRows;i++){
index = i;
down = true;
up = false;
if(i==0||i==numRows-1){
while(index<s.length()){
res[resIndex++] = s.charAt(index);
index = index+gap;
}
continue;
}
while(index<s.length()){
if(down){
gap2 = 2*numRows-2*i-2;
res[resIndex++] = s.charAt(index);
index = index+gap2;
down = false;
up = true;
}else if(up){
gap2 = 2*i;
res[resIndex++] = s.charAt(index);
index = index+gap2;
down = true;
up = false;
}
}
}
return new String(res);
}
}