螺旋矩阵
一、问题描述:给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
二、问题分析
1.理解题目螺旋操作,从外面一圈到里面一圈以此类推
2.分解问题步骤,将一圈视作一次完整的循环,每次循环又分四次不同边的遍历(左-右、上-下、右-左、下-上)
3.确定每次遍历的边界左闭右开,每一次循环四条边的遍历个数(长度)都一样,用len(变化)记录
4.确定每次循环的起始位置Star x,y,用i,j表示当前行列(便于续上当前到哪了)
5.考虑n为奇数时,最后会漏掉一个中间位置的元素,单独处理
三、代码思路
外层循环控制总的圈数,内层四个小循环遍历每条边
维护变量,每圈从哪开始x,y,和当前位置i,j,每一大圈每次遍历的长度len
总的循环loop数,count填入数字
四、代码实现
public static void printArry(int n) {
int nums[][] = new int[n][n];
int i, j; //当前行列所在位置
int x = 0, y = 0; //初始时xy轴位置
int len = n-1; //每次遍历时边的长度
int count = 1; //当前位置应填入的数字
int loop = 0; //四条边为一次循环,loop表示循环圈数
while(loop<n/2){
//左---右
for (j = y; j < len; j++) {
nums[x][j] = count++;
}
//上---下
for (i = x; i <len ; i++) {
nums[i][j] = count++;
}
//右---左
for (; j > y ; j--) {
nums[i][j] = count++;
}
//下---上
for (; i > x; i--) {
nums[i][j] = count++;
}
loop++;
x++;
y++;
len--;
}
if(n%2==1){ //奇数需最后处理
nums[n/2][n/2] = count;
}
//输出数组
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
System.out.print(nums[i][j] + " ");
}
System.out.println();
}
}
五、总结:搞清楚问题流程,寻找规律与边界条件,维护的变量,记录当前位置的变量

浙公网安备 33010602011771号