Print Zigzag
思路:
1 首先是按行输出,每行输出相同位置的下一间隔为row*2-2
,行游标0<i<row;
2 行内输出,考虑中间斜向部分,首行和末行,直接打印空格,中间部分,需要打印斜向字符及前后空格
斜向部分字符在字符串中的坐标为span+j-2*i
,其中j为行内游标(列游标)
斜向字符前面空格数为row-2-i
,斜向字符后空格数为i-1
3 为什么是span+j-2*i
?
初始化时(每一行的首个斜向部分),j=i,字符位置为span-i+(j-i),其中j-i==0;
也必须这样初始化,因为要打印出首列的字符,通过j=i初始化,完成j的自增1,还能控制本行下一字符的输出;
第二个斜向部分,j+=span,字符位置为 span*2-i==span-i+(j+=span)-i==span+j-2*i;
….
重点是:span-i是位置,配合行内游标j,使得位置可以行内自增,但是要减去初始化的值,即j=i;
所以,有了span-i+j-i,即span+j-2*i
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| public static void printZigZag(String s,int row) { if (s.length()==0||row<1) { return; } if (row==1) { System.out.println(s);; } int span=row*2-2; int zig=row-2; for (int i = 0; i < row; i++) { for (int j = i; j < s.length(); j+=span) { System.out.print(s.charAt(j)); if (i!=0&&i!=row-1&&span+j-2*i<s.length()) { for (int j2 = 0; j2 < zig-i; j2++) { System.out.print(" "); } System.out.print(s.charAt(span+j-2*i)); for (int j2 = 0; j2 < i-1; j2++) { System.out.print(" "); } } else { for (int j2 = 0; j2 < zig; j2++) { System.out.print(" "); } } } System.out.println(); } }
|
EOF by toto