问题:输入一个奇数n,打印高度为n的菱形字符。

一日闲来无事,脑中灵光一现,突然想试试打印字符玩玩。传统的打印菱形字符的方法无外乎1.依次打印菱形的4个角。2.先打印菱形的上半部分,然后再打印下半部分。3.暴力徒手打印。网上的资料也大多依此思路实现。但是实现的代码往往雷同且有多个for循环,看起来十分别扭。

这里提供一个相对优雅的方法:

1
2
3
4
5
  *
 ***
*****
 ***
  *

观察上面的图像,可以看到每一行的空格数(只打印左边的空格,右边的无需打印)的规律符合函数:y = abs(x + 2),其中x从0~n-1,n为菱形的高度,x为行号,y为第x行对应的左边的空格数。

更一般的,将公式推广到一般的n也是成立的,这些通过在草纸上画出函数图像即可得出。这里不再赘述。

现在有了空格数,求所需打印的字符也便容易了,想象成一个正方形的盒子,每一行除了空格就是字符,现在知道了每一行左边的空格数y,那么这一行总共有2 * y个空格,且这一行总共有n个字符,那么所需打印的字符数便为n - 2 * y。有了公式,打印菱形的代码便很容易就可以写出:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
//打印菱形
    public static void printRhombus(int height, char charShape) {
        for (int row = 0; row < height; row++) {
            int blankCount = Math.abs(-1 * row + (height - 1) / 2);
            int charCount = height - 2 * blankCount;
            for (int col = 0; col < blankCount; col++) {
                System.out.print(" ");
            }
            for (int col = 0; col < charCount; col++) {
                System.out.print(charShape);
            }
            System.out.println();
        }
    }