我的
- 想法:两重循环,控制换行,打印对应递增数字
- 问题:只能打印出第一行,虽然可以换行但是打印的数字不对
正确
代码
//题目:
/*
* 学习到:
* -------写代码遇到的问题
* 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就是帮助把没搞清楚的搞清楚。