某少儿教育面试题目

  1. 走棋盘问题,有多少条路径?
    给一个m*n大小的棋盘,从左上角到右下角有多少条路径?
    动态转换方程式:dp[i][j] = dp[i-1][j] + dp[i][j-1].
int maxPaths(int m,int n)
{
	 vector<vector<int> > dp(m,vector<int>(n,1));
        for (int i = 1; i < m; i++)
        {
            for (int j = 1; j < n; j++)
            {
                dp[i][j] = dp[i-1][j] + dp[i][j-1];
            }
        }
        return dp[m-1][n-1];
}
  1. tcp的保活机制?
    tcp协议位于传输层,提供可靠的、面向连接的和全双工的字节流传输服务。通过定时的发送keepalive报文,对方是否回复ACK来探测对方主机的当前的状态。当收到对方ACK后重启定时器,超时收不到对方发送的ACK则认为对方关闭连接,本端也关闭连接。

  2. c++中是如何实现多态的。
    在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。如果对象类型是派生类,就调用派生类的函数;如果对象类型是基类,就调用基类的函数。
    (1) 用virtual关键字申明的函数叫做虚函数,虚函数肯定是类的成员函数。
    (2) 存在虚函数的类都有一个一维的虚函数表叫做虚表,类的对象有一个指向虚表开始的虚指针。虚表是和类对应的,虚表指针是和对象对应的。
    (3) 多态性是一个接口多种实现,是面向对象的核心,分为类的多态性和函数的多态性。
    (4) 多态用虚函数来实现,结合动态绑定.
    (5) 纯虚函数是虚函数再加上 = 0;
    (6) 抽象类是指包括至少一个纯虚函数的类。

  3. 析构函数为什么是虚函数。
    (1) 析构函数定义为虚函数时:基类指针可以指向派生类的对象(多态性),如果删除该指针delete []p;就会调用该指针指向的派生类析 构函数,而派生类的析构函数又自动调用基类的析构函数,这样整个派 生类的对象完全被释放。
    (2) 析构函数不定义为虚函数时:编译器实施静态绑定,在删除基 类指针时,只会调用基类的析构函数而不调用派生类析构函数,这样就会造成派生类对象析构不完全。
    (3) 最终的结果就是导致了内存泄漏。

  4. 构造函数可以使虚函数吗?
    虚函数调用是在部分信息下完成工作的机制,允许我们只知道接口而不知道对象的确切类型。 要创建一个对象,你需要知道对象的完整信息。 特别是,你需要知道你想要创建的确切类型。 因此,构造函数不应该被定义为虚函数。

  5. 多路复用实现I/O
    首先,一个进程至少会创建一个线程,多个线程共享一个程序进程的内存。程序的运行最终是靠线程来完成操作的。线程的数量跟CPU核数有关,一个核最多能发出两个线程。线程的操作主要分为:一:给CPU进行程序命令的执行。二:IO的操作(读取或输出数据)或者请求网络数据。
    其次,如果一个I/O流进来,我们就开启一个进程处理这个I/O流。那么假设现在有一百万个I/O流进来,那我们就需要开启一百万个进程一一对应处理这些I/O流(——这就是传统意义下的多进程并发处理)。思考一下,一百万个进程,你的CPU占有率会多高,这个实现方式及其的不合理。所以人们提出了I/O多路复用这个模型,一个线程,通过记录I/O流的状态来同时管理多个I/O,可以提高服务器的吞吐能力。
    IO模型包括异步/同步、阻塞/非阻塞等。多路复用的实现有多种方式:select、poll、epoll。

  6. select和epoll的区别?
    select:本质是通过设置或者检查存放fd的标志位的数据结构进行下一步处理。这样的缺点就是,单个进程可监视的fd存在数量限制;同时,当套接字比较多的时候,每次select都要遍历所有的fd来完成调度,非常的耗时;用户空间和内核空间的大量复制操作对CPU来说开销很大。
    epoll:epoll不存在最大并发连接的显示,能打开的fd的个数远远大于select;epoll采用的不是轮询方式,而是采用回调方式,活跃的fd才会调用回调函数;内存拷贝,利用mmap()文件映射内存加速与内核空间的消息传递;即epoll使用mmap减少复制开销。
    但是两种IO各自性能的好坏也取决于应用场景,在连接数比较少的时候select可以满足要求。

  7. const变量如何初始化。
    const可以用来声明常量也就是说他的值不能被修改;const成员必须在定义的时候同时初始化,不能进行赋值 ;const成员变量只可以初始化列表中初始化。初始化列表是先于构造函数的函数体执行,并且成员的初始化列表与成员的声明顺序相同的。

  8. tcp传输怎么判断数据发送成功?
    tcp发送接口:对于发送端而言,用户空间调用send接口发送数据,内核将data数据拷贝到内核空间的socket对应的缓冲区,返回的数值仅仅表示成功拷贝的字节数,并不是已经发送的字节数。send的阻塞和非阻塞,如果缓冲区的空间大于数据的字节数,阻塞和非阻塞情况都可以成功将数据成功拷贝到缓冲区;但是当缓冲区的空间小于要发送的数据时,阻塞模式会进行阻塞,等待内核缓冲区空闲空间,然后继续将数据拷贝到缓冲区,直到全部拷贝完为止;非阻塞模式会立即返回,返回已经被拷贝到发送缓冲区的数据量。要判断TCP数据包是否发送成功,在内核源码中查找,发现内核导出了2个获得已使用发送缓冲的编程接口;ioctl接口:ioctl(tcp_socket, SIOCOUTQ, &value);,通过计算缓冲区大小和数据量大小进行判断数据是否已经发送成功。

程序猿的情书

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值