每日博客笔记day 4
每日博客笔记里面有自己的算法学习笔记,也有自己学习C++的语法的笔记内容,或者自己看面试题目的写的总结内容
每日算法
59.螺旋矩阵II
给你一个正整数 n
,生成一个包含 1
到 n2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
个人实现思路:
- 先声明一个二维n*n的vector数组
- 找到边界的判断条件,然后for循环去判断
模拟顺时针画矩阵的过程:
- 填充上行从左到右
- 填充右列从上到下
- 填充下行从右到左
- 填充左列从下到上
我们遵循一个循环不变量的原则,意思就是我们对每条边的处理规则都是一样的,不能改变每条边的结束条件
在我这里我们采用是左闭右开的原则来
一入循环深似海 | LeetCode:59.螺旋矩阵II_哔哩哔哩_bilibili
在这里判断传入的数是否存在奇数和偶数的情况
我们需要在循环的外面去定义起始位置和终止位置,
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> result(n, vector<int>(n, 0));
int loop = n / 2; //loop表示的是循环的次数
int startx{}, starty{}; //表示的循环开始的位置
int mid = n / 2; //
int count = 1;
int offset = 1; //offset为设置位
while (loop--)
{
size_t i = startx, j = starty;
for (; j < n - offset; j++)
{
result[startx][j] = count++;
}
for (; i < n - offset; i++)
{
result[i][j] = count++;
}
for (; j > starty; j--)
{
result[i][j] = count++;
}
for (; i > startx; i--)
{
result[i][j] = count++;
}
startx++, starty++, offset++;
}
if ((n % 2) == 1)
{
result[mid][mid] = count; //如果传入的n为奇数的话,那么进行的操作就是对中间的数值赋值
}
return result;
}
};
总结:
- 有一个循环不变量的控制
- 边界的处理条件要控制好
- 奇数和偶数的判断也要注意
自己刚刚开始的时候写了好几次都没有通过,结果问题是在最后的(n % 1) == 1,result[mid][mid] = count;判断的条件写错了,想了半天代码没问题啊,结果代码的细节上写错了,真的让人蛮无语的
面试题目内容
在C++程序员面试秘籍这本书里面提到了很多C++的面试的内容
类初始化列表的初始化顺序和类中成员变量的声明顺序是相同的
这个知识点涉及到初始化列表的构造顺序
class Test {
public:
Test(int a): A(a),B(A){}
int B;
int A;
};
int main()
{
Test test(100);
cout << test.A << char(10);
cout << test.B << char(10);
return 0;
}
更多的情况下还是推荐在初始化列表中进行赋值操作,因为构造函数的调用顺序是先调用初始化列表,然后再去调用函数体内的操作的
当我们初始化const,reference和父类的构造函数的时候,我们只能在初始化列表中进行初始化
如果对const和reference是不能够编译通过的
class Father
{
public:
Father(int a) : fa(a){}
private:
int fa;
};
class Son : public Father
{
public:
Son(int s,int f):Father(f),son(s) {}
private:
int son;
};
int main()
{
return 0;
}
这是一个子类调用父类构造函数的例子,被称为委托构造函数
委托构造函数也是一个知识的难点,需要重点去花时间掌握
3. 类内静态和非静态的区别
这是一个非常老的面试题目了,但是每个C++的程序员都需要熟练的掌握
静态成员只能在类外进行初始化操作,类内声明,类外初始化
静态成员函数不能够访问非静态成员,因为静态成员没有this指针,他们都不可以去访问类内的成员
静态成员是存放在静态区中的,是程序在编译期间就已经初始化了的数值
4. 静态数据成员是否会受到private的作用?
这个题目的答案当时说不会受到,当时以为是他写错了,但是想想感觉怎么去理解才是有道理的
private是可以隐藏数据成员的访问权限的
但是private是不可以限制静态数据成员在类外的初始化操作的