ZigZag Conversion
题意:给一个字符串,与nrows,逐行输出对应的zigzag图形。Zigzag图形可以理解成类似vvvvvvvvvvvvvv的图形(注意,每个v是相连的,没有中间的缝隙)。
解法:
O(n)解法:对于最上面一行和最下面的一行,找出对应起始点,分别为1和nrows,之后每个点都比前一个点大2*nrows-2
对于中间的每行,其实每一行相当于两行放在一行,交替输出,第一行起点就是这是第几行,第二行起始点为2*nrows-i,两行交替输出,每行中后一个点比前一个点大2*nrows-2。
public class Solution146 {
public String convert(String s, int nRows) {
if (nRows==0||nRows==1){
return s;
}
int n=s.length();
char[] chars=new char[n];
int high=0;
for (int i=1;i<=n;i=i+2*nRows-2){
chars[high]=s.charAt(i-1);
high++;
}
for (int i=2;i<nRows;i++){
int j,k;
for(j=i,k=2*nRows-1-(j-1);j<=n&&k<=n;j=j+2*nRows-2,k=k+2*nRows-2){
chars[high]=s.charAt(j-1);
high++;
chars[high]=s.charAt(k-1);
high++;
}
if (j<=n){
chars[high]=s.charAt(j-1);
high++;
}
}
for (int i=nRows;i<=n;i=i+2*nRows-2){
chars[high]=s.charAt(i-1);
high++;
}
return new String(chars);
}
}