中山免费企业网站建设,四博互联做的网站,南宁 百度网盘,微网站怎么注册账号1.题目 2.思路 #xff08;借用代码随想录的图#xff09; 1.我们将转一圈看作一个循环#xff08;1-2-3-4-5-6-7-8 这是一个循环#xff09; 2.在这个循环里#xff0c;我们要画四条边#xff08;上右下左#xff09; 填充上行从左到右 填…1.题目 2.思路 借用代码随想录的图 1.我们将转一圈看作一个循环1-2-3-4-5-6-7-8 这是一个循环 2.在这个循环里我们要画四条边上右下左 填充上行从左到右 填充右列从上到下 填充下行从右到左 填充左列从下到上 3.因为画这四条边有重复元素我们为了统一处理拐角处元素的规则规定拐角处都让给新的一条边就是上图不同颜色的边 4. 这样就有两个循环了第一个循环表示要绘制多少个四条边第二个循环里绘制四条边
3.实施细节
1.在画每一条边的时候我们首先考虑到的第一个问题是怎么把数写到对应位置去 解决设置一个遍历参数表示当前的位置 ori_i (表示当前位置的横坐标) ori_j表示当前位置的列坐标 res[ori_i][ori_j] num;
2.接下来会遇到什么时候该画下一条边 解决设置边界参数按3*3矩阵举例 col_max2列最大边界col_min0(列最小边界) row_max2(行最大边界) row_min0 拿上行从左到右举例当遍历参数ori_j col_max 时画这条边 其他三条边类推
3 画完这四条边后就该进入到下一个循环了该继续画下一个四条边了。这时候我们要设置开始绘制的起点。通过一个start参数来设置每次循环的起点
4 要注意当n奇数的时候最后最中间会只留下一个小块这个时候我们规定这四条边都不绘制中间的小块我们跳出循环单独给这个小块赋值
5 怎样判断绘制结束 解决当row_min row_max 时结束 注意这里是大于等于 因为当row_minrow_max的时候表示只剩下中间一个小块了而根据4.的规定中间小块我们要跳出循环来单独赋值
4.Java代码实现 class Solution {public int[][] generateMatrix(int n) {int[][] res new int[n][n];int start 0; //定义初始点//定义边界int row_max n - 1;int col_max n - 1;int row_min 0;int col_min 0;int num 1; //定义要写的数while (row_max row_min) {int ori_i start;int ori_j start;//上侧从左到右for (; ori_j col_max - 1; ori_j) {res[ori_i][ori_j] num;num;}//右侧从上到下for (; ori_i row_max - 1; ori_i) {res[ori_i][ori_j] num;num;}//下侧从右往左for (; ori_j col_min 1; ori_j--) {res[ori_i][ori_j] num;num;}//左侧从下往上for (; ori_i row_min 1; ori_i--) {res[ori_i][ori_j] num;num;}//更新边界row_max--;col_max--;row_min;col_min;//更新初始点start;}//如果是奇数需要给最中间的单独赋值if (n % 2 1) {res[start][start] num;}return res;}
}