[Java基础] 输出回形数

输出回形数, 根据两种算法画图如下:

回形数

第一种算法: 分析行特征,按行输出

import java.util.Scanner;

public class CircleFormNumber {
    public static void main(String[] args) {
        System.out.println("请输入一个数,按回车结束:");
        Scanner reader = new Scanner(System.in);
        int n = reader.nextInt();
        int parallelNum = 0;// parallelNum:一行输出中,中间重复数字的个数
        Long beginMillis = System.currentTimeMillis();
        // 算法开始执行的时间
        int totalLines = 2 * n - 1;// 计算输出的总行数
        // --算法部分--
        for (int i = 0; i < totalLines; i++) {
            if (i < n) {
                parallelNum = totalLines - 2 * i;
                // 当行数小于初始数时,totalLines-2*i是正值
                for (int j = 0; j < totalLines; j++) {
                    // 一行一行地输出,j表示第j个位置上的数
                    // 当j<i的时候,输出递减一的数值
                    if (j < i) {
                        System.out.print(n - j + " ");
                    }
                    // 当j>=i && j<i+parallelNum的时候,重复输出该行最小
                    else if (j >= i && j < i + parallelNum) {
                        System.out.print(n - i + " ");
                    }
                    // 当j>i+parallelNum-1 && j<totalLines的时候,输出递增1的数值
                    else if (j > i + parallelNum - 1 && j < totalLines) {
                        System.out.print(j - n + 2 + " ");
                    }
                }
            } else {
                // 当行数大于初始数时,将该行转换为上面对应输出相同的行,第i行的对应行数k
                int k = 2 * n - 2 - i;// k+i=2n-2
                parallelNum = totalLines - 2 * k;
                // 重新计算一行输出中,中间重复数字的个数
                for (int j = 0; j < totalLines; j++) {
                    if (j < k) {
                        System.out.print(n - j + " ");
                    } else if (j >= k && j < k + parallelNum) {
                        System.out.print(n - k + " ");
                    } else if (j > k + parallelNum - 1 && j < totalLines) {
                        System.out.print(j - n + 2 + " ");
                    }
                }
            }
            System.out.println();
        }
        Long endMillis = System.currentTimeMillis();// 算法结束执行时间
        long executeTime = endMillis - beginMillis;// 算法消耗时间
        System.out.println("算法从开始执行到结束共用了 " + executeTime + "毫秒");// 打印算法消耗时间
    }
}

第二种算法: 一圈一圈地生成, 而不是一行一行的生成, 将生成的值付给二维数组

思路清晰,但效率不是很高

import java.util.Scanner;

public class CircleFormNumber {
    // num代表一共几圈,n代表当前第几圈
    void f(int num, int n, int[][] array, int length) {
        for (int i = n; i < length; i++) {
            array[n][i] = num;
            array[i][n] = num;
            array[length - 1][i] = num;
            array[i][length - 1] = num;
        }
        if (num > 0) {
            f(num - 1, n + 1, array, length - 1);
        } else {
            printArr(array);
        }
    }

    void printArr(int[][] array) {
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[i].length; j++) {
                System.out.print(array[i][j] + " ");
            }
            System.out.println();
        }
    }

    public static void main(String[] args) {
        CircleFormNumber t = new CircleFormNumber();
        System.out.print("请输入一个数,按回车结束:");
        Scanner reader = new Scanner(System.in);
        int num = reader.nextInt();
        int[][] array = new int[2 * num - 1][2 * num - 1];
        int length = array.length;
        Long beginMillis = System.currentTimeMillis();
        // 算法开始执行的时间
        t.f(num, 0, array, length);
        Long endMillis = System.currentTimeMillis();
        // 算法结束执行时间
        long executeTime = endMillis - beginMillis;
        // 算法消耗时间
        System.out.println("算法从开始执行到结束共用了 " + executeTime + "毫秒");// 打印算法消耗时间
    }
}