本文已参与「新人创作礼」活动, 一起开启掘金创作之路。
大家好,我是洋哥。今天给大家带来的是每日一题——回形数格式方阵。
题目要求
回形数格式方阵的实现
从键盘输入一个整数(1-20)则以该数字为矩阵的大小,把1,2,3…n的数字按照顺时针螺旋的形式填入其中。例如:输入数字2,则程序输出:
1 2
4 3
输入数字3,则程序输出:
1 2 3
8 9 4
7 6 5
输入数字4, 则程序输出:
1 2 3 4
12 13 14 5
11 16 15 6
请写出n=7时的回形数格式方阵。
建议用时:15-20分钟
难度:较难
知识点分析
这道题主要考察的是Java的数组部分知识。以及前面所学知识的综合应用,有一定的难度。
问题分析
第一,这道题目方法也不唯一,我仅提供一些思路和想法,具体的参考代码。这道题降低了难度,它限定了n=7,如果没有指定n,又该怎么去处理呢?大家可以想一想。
第二,就这道题而言,有一个蠢办法就是一一赋值即可,他有没有要求一定要用什么方法,这是一个矩阵肯定会用到二维数组,只要将数字与数组相应的位置对应上即可。
第三,有没有巧妙一点的方法呢。有,就是找到数组下标和数字间的关系,或者用表达式来建立两者的联系,具体的见下面的代码,看完你应该就明白了。
相关知识点复习
这道题我也不是弄得很清楚,我只能体会其中的意义,但是我却说不出来,没有掌握透彻,等以后弄透彻了在更新一下。
我也在网上搜了一下这道题,很多都反映有点难理解,这道的确有难度,根据网上的建议,要复习两点:
第一,就是程序流程控制的知识,尤其是其中的逻辑结构。
第二,数组的知识,尤其是二维数组的运用。
代码实现
class RectangleTest1 {
public static void main(String[] args) {
int n = 7;
int[][] arr = new int[n][n];
int count = 0; // 要显示的数据
int maxX = n - 1; // x轴的最大下标
int maxY = n - 1; // Y轴的最大下标
int minX = 0; // x轴的最小下标
int minY = 0; // Y轴的最小下标
while (minX <= maxX) {
for (int x = minX; x <= maxX; x++) {
arr[minY][x] = ++count;
}
minY++;
for (int y = minY; y <= maxY; y++) {
arr[y][maxX] = ++count;
}
maxX--;
for (int x = maxX; x >= minX; x--) {
arr[maxY][x] = ++count;
}
maxY--;
for (int y = maxY; y >= minY; y--) {
arr[y][minX] = ++count;
}
minX++;
}
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length; j++) {
String space = (arr[i][j] + "").length() == 1 ? "0" : "";
System.out.print(space + arr[i][j] + " ");
}
System.out.println();
}
}
}
总结和建议
当我们遇到难题时,不要退缩,不要放弃。虽然你可能受到挫败,但是这就是成长,我们遇到难题要抱有积极的形态,能理解多少理解多少,剩下的先放着,等回头再看看,说不定就有意外收获。