该题为腾讯mxg面试委员会二面试题,要求如下:
逐行打印n * n回型矩阵( 不可以在内存填好整个矩阵然后再打印)
n=3
1 2 3
8 9 4
7 6 5
n=4
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
不在内存中开辟二维数组,则应该寻找(i, j)与num的关系,达到O(1)计算(i, j)上应该填充的num
将二维数组看成一层一层的圈,如图。外层(红色)为第0圈,中间层(深蓝)为第1圈,内层(浅蓝)为第2层
以下均以n=6为例:
根据n的大小可计算(i, j)所处在第几个圈中,i_circle_index = Min(Min(i, j)-0, n-1-Max(i, j))
其实就是判断i, j中离0或n-1大小最小的那个就是当前圈,如(0, 3)->0,(1, 2)->1,(1, 5)->0,(2, 3)->2
根据n和(i, j)所处圈可计算当前圈中数字的个数i_circle_num = (n-1-(2*i_index))*4<=0?1:(n-1-(2*i_index))*4,这个比较好理解,就不做解释了
接下来就是求每个(i, j)所对应的值num了