01-螺旋矩阵(力扣题号59

发布时间 2023-10-01 10:02:38作者: 行至为成

我的

  • 想法:两重循环,控制换行,打印对应递增数字
  • 问题:只能打印出第一行,虽然可以换行但是打印的数字不对

正确

  • 思路:创建二维矩阵;给二维矩阵赋值;打印二维矩阵

代码

//题目:
/*
* 学习到:
* -------写代码遇到的问题
* 1. vector容器初始化:
* 2. 函数返回类型的确定:该函数(generateMatrix的类型应是二维数组,要返回一个构建好的二维数组
* 3. vector容器元素的打印:
* -------运行代码遇到的问题,调试
* 4. for循环第一个条件不能赋值,会影响到后续循环。eg:for(i = 0; i < startx + n - length; i++)
* 5. n为奇数时,最中间的值要放到最后赋值,所以要放到循环外
* ------------
* 此代码测试用例n=1~7,没有问题
*/
#include <iostream>
using namespace std;
#include <vector>
//解决方法
class Solution
{
public:
	//方法
	//返回二维数组:将二维矩阵元素赋值为规定元素,函数名generateMatrix
	vector<vector<int>> getMarix(int n) {
		vector<vector<int>> res(n, vector<int>(n, 0));	//--vector初始化?
		//参数定义赋初值
		int loop = n / 2;	//矩阵螺旋的圈数
		int startx = 0, starty = 0;	//螺旋起始位置
		int cnt = 1;	//矩阵元素赋值
		int length = 1;	//行或列距边界的长度
		int mid = n / 2;	//中间下标
		//螺旋圈数
		while (loop--) {
			//四周转圈赋值
			int i = startx;
			int j = starty;
			//第1行,从j=0开始---四周的上边
			for ( ; j < starty + n - length; j++) {
				res[i][j] = cnt++;
			}

			//第n列,从i=0开始---四周的右边
			for ( ; i < startx + n - length; i++) {
				res[i][j] = cnt++;
			}

			//第n行,从j=starty+n-length开始---四周的下边
			for ( ; j > starty; j--) {
				res[i][j] = cnt++;
			}

			//第1列,从i=startx + n - length开始---四周的左边
			for (; i > startx; i--) {
				res[i][j] = cnt++;
			}
			
			//第一圈结束,需要维护某些变量,来继续下面的循环
			startx++;	//第二圈起始位置变化
			starty++;	//
			length += 2;	//左右为2
			
		}
		//外圈都结束后,若n为奇数,需要额外给正中间元素赋值
		if (n % 2 != 0) {
			res[mid][mid] = cnt++;
		}

		return res;
	}
	

};
//无返回类型,打印vector二维矩阵元素
void printMatrix(const vector<vector<int>>& matrix) {
	int m = matrix.size();	//二维数组中一维数组元素的个数
	int n = matrix[0].size();	//一维数组中元素的个数

	for (int i = 0; i < m; i++) {
		for (int j = 0; j < n; j++) {
			cout << matrix[i][j] << " ";
		}
		cout << endl;
	}
}
//主函数
int main()
{
	/*int a[] = {0};
	int target = 0;

	vector<int> nums(a, a + sizeof(a) / sizeof(a[0]));

	Solution solution;
	cout << "方法调用" << endl;*/
	Solution solution;
	vector<vector<int>> matrix = solution.getMarix(1);

	printMatrix(matrix);

	return 0;

}

学习到

  • 算法思路:每个题目的示例虽然可能不会覆盖全体数据,各种情况,但是一定是最标准的;首先走一遍示例,确保思路大体思路是对的;然后可以验证前后的例子,可以帮助完善,以及流程的普遍性
  • 代码编写过程:每个变量不一定能够都能最开始定义出来,经过两次应该就可以定义,且变量名应见名知意。
  • 代码出错,第一时间要弄清楚哪里错了,可能导致错误的原因有哪些,然后去看相应的代码,去缕清思路,去思考,一点点的去改正。有bug就是自己没彻底搞清楚,去提醒自己那些东西没搞清楚;调试bug就是帮助把没搞清楚的搞清楚。