文章目录
哈喽,我是长路,目前刚刚大三,方向是后端也偶尔捣鼓下前端,现在的主语言是Java。之前一大段时间都是在学习web开发的一些技术,就很久没有进行类似于数据结构、算法之类的学习与刷题,打算这段时间拾起来好好学一学、搞一搞。
这段时间也是机缘巧合看到草帽路飞的博客,加了自学群,正巧看到博主组织在群里组织了leetcode刷题打卡活动,我也就参与进来,为期一个月,打算坚持每天都花一些时间做一些题目,并通过博客的方式来进行记录。
题目来源leetcode
leetcode地址:59. 螺旋矩阵 II,难度:中等。
题目描述(摘自leetcode):
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
示例 1:
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]
示例 2:
输入:n = 1
输出:[[1]]
提示:
1 <= n <= 20
本地调试代码:
class Solution {
//业务代码
public int[][] generateMatrix(int n) {
...
}
public static void main(String[] args) {
int n = 4;//设置边长度
printMatrix(n);
}
public static void printMatrix(int n){
Solution solution = new Solution();
int m = n * n;
int numLen = 0;
while (m > 0) {
m = m / 10;
numLen++;
}
numLen += 2;//每个数字之间空两个
int[][] ints = solution.generateMatrix(n);
for (int i = 0; i < ints.length; i++) {
for (int j = 0; j < ints[i].length; j++) {
System.out.printf("%-" + numLen + "d", ints[i][j]); //numLen表示长度,-表示左对齐。例如:%-4d => 宽度为4,左对齐
}
System.out.println();
}
}
}
这是一道逻辑题,花费了我一个多小时解出来,关键就是需要你找到其中的规律!
思路:
刚开始实在没有头绪,就去看了大佬的一个题解思路,看到下面这张图之后就开始撸代码了,我觉得最核心的就是下面这个图,其他主要就是你要找一些规律,例如有边长n对应有多少圈;在哪一圈上下左右每次需要填充的数量;最里边填充一个数字的情况…
代码:
public int[][] generateMatrix(int n) {
int[][] matrixArr = new int[n][n];
if (n == 1) {
matrixArr[0][0] = 1;
return matrixArr;
}
//填充的数
int num = 1;
//圈数
int outCircleNums = n % 2 == 1 ? n / 2 + 1 : n / 2;
//每层(上下左右)要填充的对应数量。例如上图3*3,上下左右方向都要填充2个
int curTire = 0;
//圈数遍历
for (int i = 0; i < outCircleNums; i++) {
//求每层(上下左右)要填充的对应数量
if (i == 0) {
curTire = n - 1;//最外圈只要-1即可
} else {
curTire = curTire - 2;//里面的每一圈都要-2
}
//最内圈只有一个数的情况
if (i == outCircleNums - 1 && n % 2 == 1) {
matrixArr[i][i] = num;
break;
}
//绘制正方形上层
for (int j = i; j < i + curTire; j++) {
matrixArr[i][j] = num++;
}
//绘制正方形右边
for (int j = i; j < i + curTire; j++) {
matrixArr[j][curTire + i] = num++;
}
//绘制正方形下边
for (int j = i + curTire; j > i; j--) {
matrixArr[curTire + i][j] = num++;
}
//绘制正方形左边
for (int j = i + curTire; j > i; j--) {
matrixArr[j][i] = num++;
}
}
return matrixArr;
}
本地调试效果图:
我是长路,感谢你的耐心阅读。如有问题请指出,我会积极采纳!
欢迎关注我的公众号【长路Java】,分享Java学习文章及相关资料
Q群:851968786 我们可以一起探讨学习
注明:转载可,需要附带上文章链接