59号题目
这道题是需要模拟的,一定要注意的一个原则就是要按照一个规则去循环下去,不能这次循环是定为A条件,下次循环是定为B条件,这样很混乱,个人感觉这道题是比较考验细节能力的,可能是本人比较菜的原因才有这样的感觉
比较重要的几个点
循环圈数为n/2,比如n为2,循环一圈,n为3循环一圈,n为4,循环2圈;这里n的奇偶也是有不同的处理的,n为偶数的话,循环完刚好所有的数都打印了,n为奇数的话,循环完最后还会剩下一个n这个数没有打印,然后正常将它打印就行了
每次的循环都是算第一个点,抛弃最后一个点,也就是左闭右开原则
更多细节详见代码注释
class Solution {
public int[][] generateMatrix(int n) {
int initialx = 0, initialy = 0;//每一次循环行列的起点
int circle = 1;//循环圈数
int i, j;
int count = 1;//计数器,每走一个加一即可,走到n结束
int[][] result = new int[n][n];
while(circle <= n/2){//总共循环n/2圈
for(j = initialy; j < n-circle; j++){//从左至右
result[initialx][j] = count++;
}
for(i = initialx; i < n-circle; i++){//从上至下
result[i][j] = count++;
}
for(; j > circle-1; j--){//从右至左
result[i][j] = count++;
}
for(; i > circle-1; i--){//从下至上
result[i][j] = count++;
}
initialx++;
initialy++;
circle++;
}
if(n % 2 ==1){//n为奇数
result[initialx][initialx] = count;//最后一个数为n
}
return result;
}
}