回型数组
今天偶然做到了这道稍稍有些难度的算法题,写一个回型数组,具体要求如下:
输入一个数字n,要求输出回型数组,例如:
//输入3
//输出 1 2 3
// 8 9 4
// 7 6 5
//输入4
//输出 1 2 3 4
// 10 11 12 5
// 9 8 7 6
相信大家从名字上就可以理解回型数组的形式,就是绕着中间去组成一个矩阵。这道题手写起来很容易,但是如何去编程实现还是有点难度的,因此在这里和大家分享下我的解法。
题目分析
看到题目的时候第一个想法就是按照我们人手写回型数组的方式从1一直写到n2,因此不难发现在完成数组的过程中需要依次用到向右向下向左向上四个操作,而后再进行循环,直到最终填补完成整个回型矩阵。
接下来还需要考虑几个问题:
1.假设向4个方向各填数一次,即右=>下=>左=>上各填数为一轮操作,则需要进行几轮;
2.每轮中,各个方向所填数的数量为多少;
3.当n为奇数和偶数时,有无不同。
这几个问题想来并不难得出结果,为了方便分析,我们在每一轮操作中,让每个方向填数的数量,均为需要填的矩阵的维度减1。
下图为3×3矩阵,我们进行第一轮操作时,每个方向填2个数,即向右填1,2,向下填3,4,向左填5,6,向上填7,8;在第二轮操作中,就剩下一个9.
下图为4×4矩阵,第一轮操作时每个方向填3个数,在进行第二轮操作时,向右填13,向下填14,向左填15,向右填16,从而完成回型数组。
相信大家在上述过程中,也发现了当n为奇数时,最里面一定会剩下一个数,也就是n2;而偶数的时候,最里面一定是个2×2矩阵。因此当n为奇数时,首先将中心的数填好,再完成周边的填写,而偶数时就正常填写矩阵即可。
代码展示
//-----------------回型矩阵--------------------
//初始化
System.out.println