每日博客day4

每日博客笔记day 4

每日博客笔记里面有自己的算法学习笔记,也有自己学习C++的语法的笔记内容,或者自己看面试题目的写的总结内容

每日算法

59.螺旋矩阵II

代码随想录 (programmercarl.com)

给你一个正整数 n ,生成一个包含 1n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix

​ 个人实现思路:

  1. 先声明一个二维n*n的vector数组
  2. 找到边界的判断条件,然后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;
    }
};

总结:

  1. 有一个循环不变量的控制
  2. 边界的处理条件要控制好
  3. 奇数和偶数的判断也要注意

自己刚刚开始的时候写了好几次都没有通过,结果问题是在最后的(n % 1) == 1,result[mid][mid] = count;判断的条件写错了,想了半天代码没问题啊,结果代码的细节上写错了,真的让人蛮无语的

面试题目内容

在C++程序员面试秘籍这本书里面提到了很多C++的面试的内容

  1. 类的成员初始化列表的顺序

类初始化列表的初始化顺序和类中成员变量的声明顺序是相同的

这个知识点涉及到初始化列表的构造顺序

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;
}

  1. 什么时候使用初始化列表来赋值操作,什么时候在函数体内进行初始化操作

更多的情况下还是推荐在初始化列表中进行赋值操作,因为构造函数的调用顺序是先调用初始化列表,然后再去调用函数体内的操作的

当我们初始化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是不可以限制静态数据成员在类外的初始化操作的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值