面试算法题:打印出如下图案(菱形)

题目

打印出如下图案(菱形)
菱形

思考

传统思想一般会用两层for语句根据每个点的位置控制输出。
当然我这里也是这么想的,但是我想扩展一下,让算法更通用一些。那么我们用线性规划的方法是不是就能兼容更加复杂的不规则的图案绘制了呢?

代码:

    public static void main(String[] args) {
        createRhombus();

    }

    private static void createRhombus() {
        // TODO Auto-generated method stub
        int m = 8, n = 8;
        for (int i = 0; i <= m; i++) {
            for (int j = 0; j <= n; j++) {
                if (isInRhombus(i, j, m, n)) {
                    System.out.print("*");
                } else {
                    System.out.print(" ");
                }
            }
            System.out.println();
        }
    }

    private static boolean isInRhombus(int x, int y, int m, int n) {
        // TODO Auto-generated method stub
        int s = m * n;
        if (2 * n * x + 2 * m * y >= s && 2 * n * x - 2 * m * y <= s
                && -2 * n * x + 2 * m * y <= s
                && 2 * n * x + 2 * m * y <= 3 * s) {
            return true;
        }
        return false;
    }

如果遇到其他形状,只需要把isInRhombus方法的线性规划修改一下,android代码里一般统一成一个接口,然后不同形状就集成这个接口来实现不同效果。

比如下面我们可以很方便的扩展实现其他图像,例如冰激凌

冰激凌代码

public static void main(String[] args) {
        createRhombus();

    }

    private static void createRhombus() {
        // TODO Auto-generated method stub
        int m = 16, n = 16;
        for (int j = 0; j <= n; j++) {
            for (int i = 0; i <= m; i++) {
                if (isInRhombus_icecream(i, j, m, n)) {
                    System.out.print("*");
                } else {
                    System.out.print(" ");
                }
            }
            System.out.println();
        }
    }

    //画冰激凌
    private static boolean isInRhombus_icecream(int x, int y, int m, int n) {
        // TODO Auto-generated method stub
        int s = m * n;
        if(((y<=n/2)&&((2*x-m)*(2*x-m)+(2*y-n)*(2*y-n)<=m*m))||((y>n/2)&&(-2 * n * x + 2 * m * y <= s&& 2 * n * x + 2 * m * y <= 3 * s))){
            return true;
        }

        return false;
    }

面试算法题:打印出如下图案(菱形)_第1张图片

你可能感兴趣的:(java面试题目最优算法)