童鞋们应该对“打印星形图案”的编程题记忆犹新吧? 那就像我们的编程童年一样的美好。 打印边长为 n 个菱形, HO, 有的人立马就刷刷刷写出来了:
package patterns.interpretation;
public class FigurePrinting {
/**
* 根据给定 n 值打印菱形图案
* @param n 菱形的边数
*/
public void printDiamond(int n)
{
if (n < 2) {
throw new IllegalArgumentException("参数 n = " + n + " 错误, 给定参数必须不小于 2!");
}
int midRow = n-1;
for (int row = 0; row <= midRow; row++) {
printLine(new int[] { midRow-row , midRow+row}, 2*n-1, '*');
}
for (int row = midRow+1; row < 2*n-1; row++) { // 对称性: row = midRow+i 与 row = midRow-i 的图案是一样的
printLine(new int[] { row - midRow, midRow + (2*midRow - row)}, 2*n-1, '*');
}
}
/**
* printLine: 在指定的若干位置上,打印符号; 不打印符号的位置打印空格
* @param indexes 指定要打印符号 symbol 的位置数组
* @param n 一行总共要打印的字符数
* @param symbol 要打印出的符号
*/
public void printLine(int[] indexes, int n, char symbol)
{
if (indexes == null || indexes.length == 0) { // 如果位置数组为空,则直接换行
System.out.println();
return ;
}
if (n < indexes.length) {
throw new IllegalArgumentException("要打印的符号数超过一行的总字符数!");
}
int k = 0;
for (int i=0; i < n; i++)
{
if (i != indexes[k]) {
System.out.printf("%c", ' ');
}
else {
System.out.printf("%c", symbol);
k++;
if (k == indexes.length) {
for (i = indexes[k-1]; i < n; i++) {
System.out.printf("%c", ' &