一面:
项目
- 图形和视觉相关的工作有做过吗;
- opencv 用了什么;
- 项目中图像算法都用了什么;
C++ 基础
- static (作用域、存储区)
- extern、extern “C”;带extern "C"生成的函数有什么区别呢;(c++编译方式将函数名和参数列表编译成唯一名字;C编译只将函数名进行编译,无法实现重载)
- Override、Overload;Override关键字怎么用的;(可以显式的在派生类中声明,哪些成员函数需要被重写,如果没被重写,则编译器会报错。)
- 虚函数;
- 各种类型转换的 cast 的区别;dynamic_cast能转不带虚函数的类的吗,dynamic_cast转被强制转换过的指针可以吗;(不能转换不带虚函数的类的指针;出错返回空指针(应该是只会去管指针的类型))
- 多继承的时候虚函数表指针;
- auto关键字;下面代码问:C是什么;(c是拷贝)//*
vector<int>a;
vector<int> & b = a;
auto c = b;
- lambda;为什么要有lambda;(能在函数内定义;存在访问权限;可以作为函数参数或返回值,用作回调;)
- lambda;变量捕获;(值捕获、引用捕获)
- 下面这样使用lambda 会有什么问题;(返回栈中已经退出了的内存)
auto cal()
{
int c;
auto fun = [&](){
return c;
};
return fun;
}
void main()
{
auto x = cal();
x();
}
- shared_ptr 用 make_shared 的优势;(不用new、提高性能、异常安全)
- shared_ptr 中为啥用指针;(因为要多个对象指向同一个引用计数)
OS
- 进程线程;(线程共有、线程私有)
- fork 的父子进程的相同的地方、不同的地方;(文件、共享内存呢)
- POSIX线程了解吗;
- 有哪些锁;
- 无锁数据结构知道吗
- 为什么要有cache;//*
- JAVA 为啥比C++慢(垃圾回收、在jvm上跑);还有吗?(java理解为解释性语言,需要jvm解析后调用os提供的系统调用,相当于倒了一手)
- 类中成员分开new,一起new 有区别吗;(局部性原理?)
- 面向对象的设计模式,算不算是cache友好;
计网
- socket API ;
- listen 会阻塞吗;(不会)
- accept 会阻塞吗 ;(会)
手撕
- 二叉树中找最大的二叉搜索树;
- 后续遍历的树形dp;
- 递归回溯做就行;最好加上记忆化
- 二分查找找lower bound;
- 边界处理一下就好
二面:
项目扩展基础
基础顺着项目问了一下而已
- tcp、udp;
- 滑动窗口实现机制;
- udp比较tcp 的好处;
- udp怎么保证数据准确性;(应用层自己保证)
手撕
- 设计一个timermanager;用于实现对多个定时器的管理;
- 基于之前的tcp讲到的,就说发送报文会开启定时器;做一个定时器维护的接口;
- 给了三个接口;
- add:添加一个定时任务;包括要定时的时间、回调函数;要求返回一个id;
- delete :删除对应id 的定时器;
- update :外部会去调用的函数,输入一个时间戳;(用这个来更新内部时间戳;
- 我用了树结构存储id;在update 的时候O(n)的暴力搜;复杂度太高了;
- 问题抽象为:判断矩形相撞
- 我用了四个顶点在另外一个矩形内来判断;
- 被指出矩形相交的问题;
- 问题抽象为:字符串中有多少个对应子序列;
- 我说应该用回溯或者动规来做,但是我暂时只想到了用回溯;
- 回溯写了差不多,面试官时间到了结束吧。。。。。。。。。。
总结
- 整体的压力很大,刚好我还发烧了;整个面试过程人都麻了;
- 问的题都没完整撕出来;然后面试官觉得我写的太慢了,导致压力更大。。然后死循环