面试题:打印螺旋数字

输入一个n,打印n阶螺旋

n = 1

1

n = 2

9	2	3
8	1	4
7	6	5

n = 3

25	10	11	12	13
24	9	2	3	14
23	8	1	4	15
22	7	6	5	16
21	20	19	18	17

如上,输入不同的n值得到不用的数字螺旋。通过上面的示例可以找出基本规律:1总是在最中心位置,最大边的个数与n的关系是2n-1的关系,以及最左上角的值是最大边的乘积。

在这里插入图片描述

在这里插入图片描述

如图,看看数字螺旋的规律,非常的螺旋丸,看似无迹可寻。找不到突破点,但是再强的金钟罩铁布衫也是存在破绽的。仔细看会发现在中心点左边的列总是从上往下递减的,右边是从下往上递减,上边是从右往左递减,下边是从左往右递减。并且它们都是从对角线的点开始出发发生转折。所以对角线上的点是我们要找的破绽。

在这里插入图片描述

那么对角线上的点有没有规律呢?我们会发现中心点左边的对角线值是一个奇数的平方,右边是1+偶数的平方。基本规律已经找到了,下面来看具体的实现吧,看代码!

private void printMatrix(int n) {
	int count = 2*n-1; //最大边的总个数
    int center = n-1; //中心点的位置
    int data[][] = new int[count][count];
    data[0][0] = count*count;
    //计算对角线的值,中心点左边和右边的规律不一样
    for (int i = 0, j = 1; i < count; i++) {
       if (i <= center) {
           data[i][i] = (count-2*i)*(count-2*i);
       } else {
           data[i][i] = 1 + 4*j*j;
           j++;
       }
    }

    //计算中心点左边的列
    for (int i = 0; i < center; i++) {
        for (int j = i+1; j < count-i; j++) {
            data[j][i] = data[j-1][i] - 1;
        }
    }

    //计算中心点右边的列
    for (int i = center+1; i < count; i++) {
        for (int j = i-1; j >= (count-i-1); j--) {
            data[j][i] = data[j+1][i] - 1;
        }
    }

    //计算中心点下边的行
    for (int j = (count-1); j > center; j--) {
        for (int i = count-j; i < j; i++) {
            data[j][i] = data[j][i-1] - 1;
        }
    }

    //计算中心点上边的行
    for (int j = 0; j < center; j++) {
        for (int i = count-j-2; i > j; i--) {
            data[j][i] = data[j][i+1] - 1;
        }
    }

    print(data);
}

private void print(int[][] data) {
    System.out.println("--------------------");
    for (int i = 0; i < data.length; i++) {
        for (int j = 0; j < data[i].length; j++) {
            System.out.print(data[i][j]+"\t");
        }
        System.out.println();
    }
    System.out.println("--------------------");
}

以上代码就完成了数字螺旋的计算和打印了,看下实际打印结果:
n = 3

--------------------
25	10	11	12	13	
24	9	2	3	14	
23	8	1	4	15	
22	7	6	5	16	
21	20	19	18	17	
--------------------

n = 5

--------------------
81	50	51	52	53	54	55	56	57	
80	49	26	27	28	29	30	31	58	
79	48	25	10	11	12	13	32	59	
78	47	24	9	2	3	14	33	60	
77	46	23	8	1	4	15	34	61	
76	45	22	7	6	5	16	35	62	
75	44	21	20	19	18	17	36	63	
74	43	42	41	40	39	38	37	64	
73	72	71	70	69	68	67	66	65	
--------------------

完美!成功解决数字螺旋的问题。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值