TIPS:闲暇时看到了一道java输出螺旋数字矩阵的题目,写好之后感觉好久没写博客了,就以这道题写个博客。
首先看下效果
主要是把矩阵转化为二维数组[n][n],长度为n。比如n=5时
[0][0],[0][1],[0][2],[0][3],[0][4]
[1][0],[1][1],[1][2],[1][3],[1][4]
[2][0],[2][1],[2][2],[2][3],[2][4]
[3][0],[3][1],[3][2],[3][3],[3][4]
[4][0],[4][1],[4][2],[4][3],[4][4]
说说我的思路,1->5,5->9,9->13,13-16。我把它当作一圈操作,一圈再分别对应4个小操作。
找规律可以发现,一圈操作主要看,比如图中1,17,25的位置都是圈操作的开始位置,再看下n为偶数的时候。。可以发现当n为偶数时圈数正好是n/2。如果n为奇数最后一次圈操作只操作1个数值比如上面的25。看下代码实现。
package com.example.demo;
public class Main {
public static void main(String[] args) {
int n = 5;
int[][] result = new int[n][n];
int r ,l;//数组坐标
int currentValue = 1;//当前加的值
int count = n % 2 == 0 ? n / 2 : (n - 1) / 2 + 1;//上下左右各加一次为1圈操作,需要多少次的圈操作
int m = n - 1;//下标从0开始,这里减一
for (int j = 0; j < count; j++) {
r = l = j;
if (j == count - 1) {
if (n % 2 != 0) {//这里就是判断如果是奇数的话就直接把最后一个值存入result中然//后退出。
result[r][l] = currentValue++;
break;
}
}
for (int i = -1; i < m - 2 * j; i++) {//从-1开始,因为从左到右的加操作比下面的操作多一次
result[r][l++] = currentValue++;
}
l--;
r++;
for (int i = 0; i < m - 2 * j; i++) {
result[r++][l] = currentValue++;
}
r--;
l--;
for (int i = 0; i < m - 2 * j; i++) {
result[r][l--] = currentValue++;
}
l++;
r--;
for (int i = 1; i < m - 2 * j; i++) {//一圈最后的操作比上面的少一次,所以i从1开始
result[r--][l] = currentValue++;
}
}
//打印结果
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (result[i][j] < 10) {
System.out.print(result[i][j] + " " + " ");
} else {
System.out.print(result[i][j] + " ");
}
}
System.out.println();
}
}
}
result就是最后保存结果的地方,currentValue是用来记录当前加到的值,count代表要执行多少次圈的操作。当n为奇数时最后一个数字也当作一圈特殊操作,代码中有描述。最后打印结果。