原题LeetCode链接:. - 力扣(LeetCode)
这是一道纯粹的模拟题,基本思路为:
1.分层次从左到右、从上到下、从右到左、从下到上依次进行进行填充;循环次数为n/2
2.n为奇数,则中间需要填充最后一个数(偶数正好最后一个循环填满)
循环模拟题需要确定边界,题解确定为左闭右开的原则,逐层遍历
代码如下:
int** generateMatrix(int n, int* returnSize, int** returnColumnSizes) {
*returnSize=n;//返回数组一维大小
*returnColumnSizes=(int*)malloc(sizeof(int)*n);//二维大小
int** res=(int**)malloc(sizeof(int*)*n);//结果数组n列
for(int i=0;i<n;i++){
res[i]=(int*)malloc(sizeof(int)*n);//n行
(*returnColumnSizes)[i]=n;//结果每行n维
}
int count=1;
//遍历要求:左闭右开
for(int loop=0;loop<n/2;loop++){
for(int i=loop;i<n-1-loop;i++)
res[loop][i] = count++;//从左到右
for(int i=loop;i<n-loop-1;i++)
res[i][n-1-loop]=count++;//从上到下
for(int i=loop;i<n-loop-1;i++)
res[n-loop-1][n-i-1]=count++;//从右到左
for(int i=loop;i<n-loop-1;i++)
res[n-i-1][loop]=count++;//从下到上
}
if(n%2==1)
res[n/2][n/2]=count;//奇数则填入最后一个数字
return res;
}
总结:所有循环模拟题,最重要的就是确认边界,尽可能确保每一次循环所干的事情相同,且最终能够完全模拟结果