本人是刷《代码随想录》这本书时记录一下自己的学习笔记
力扣59题是一道经典的模拟试题,所谓模拟就是模拟过程,按照题目的逻辑模拟一遍执行过程
模拟题目通常具有码量大、操作多、思路繁复的特点。
分析:
模拟过程为上图例题所示,从左上到右填数,从右上往下填数,从右下往左填数,从左下往上填数
此题我们通过模拟执行过程可知,我们的边界条件需要坚持循环不变量,就是说坚持左闭右开原则或者左闭右闭,得注意各个边界的条件判断
public int[][] generateMatrix(int n) {
int count = 1; //放入数组的元素
int i = 0; //代表行
int j = 0; //代表列
int[][] arr = new int[n][n]; //放入元素的数组
int cycles = n/2; //循环的圈数
for(int k = 0;k < cycles;k++) {
int right = n-1-i; //第n圈时,右边界和下边界停下来的数
int left = i; //第n圈时,左边界和上边界停下来的数
//从左上到右填数
for(;j < right ; j++) {
arr[i][j] = count++;
}
//从右上往下填数
for(;i < right;i++) {
arr[i][j] = count++;
}
//从右下往左填数
for(;j > left;j--) {
arr[i][j] = count++;
}
//从左下往上填数
for(;i > left;i--) {
arr[i][j] = count++;
}
i++;
j++;
}
//当圈数为奇数时,中间得填数
if(n%2!=0) {
arr[n/2][n/2] = count;
}
return arr;
}