字节跳动后端C++面试

【一面】(10:30AM , 50min)

面试官有点小严肃,但人挺好的。

自我介绍

项目:

1.你的项目说用到了reactor,说一下reactor是什么?跟proactor的区别?

2.所以说你的主线程只负责监听客户端连接啰?后面处里数据都是子线程处里?

3.你用到epoll,说一下IO多路复用解决了什么问题?

4.说一下除了epoll还有什么其他的多路复用嘛?(把select,poll,epoll仔细介绍了一遍)

5.你的有限状态机是怎么实现的说一下

6.你的线程池线程调度的算法是什么(尴尬用的最阳春的就是个队列判断。)

基础:

1.UDP,TCP的区别说一下

2.https跟http的区别在哪里

2.https的SSL建连过程会导致效率下降要怎么优化
3.https整个握手交互的过程总共花了多少rtt(可能是我面经看太少第一次看到求RTT的,还愣了一下RTT是什么)

算法:

股票买卖I和II (秒A了面试官问我是不是写过我很诚实的说对)

反问:

国际化电商是做什么的? 就想成写tiktok,不知道tiktok的话就想成海外版抖音。

面试表现: 基础不错,但你RTT怎么没算出来,很简单的题目可能你有点紧张了。

下午5点就打电话来约了隔一天二面。

【二面】(3:00PM, 1hr5min)

面试官是个还挺帅的小哥。(楼主是直的但确实挺帅)

自我介绍:

直接开始开怼C++(C++这东西不怼没事怼起来真的会出事)

1.指针和引用的区别?

2.为什么要有指针和引用?C++推荐指针还是引用?

3.智能指针说一下?

4.你说到unique_ptr有移动语义,那你说一下move是干吗的?

5.你说move是将左值转换成右值为什么要有move?move最根本解决什么问题

6.你说到右值引用,那你说一下左值右值的区别

7.好那为什么C++要有左值右值?C++的开发者为什么当初要设定左值右值目的是什么要解决什么问题(我真的不知道这时候已经被问蒙了)

8.你设计一下shared_ptr(支支呜呜讲了半天看来面试官不满意)

9.虚函数、纯虚函数区别?

10多态说一下?虚表?

11.

class A{
int test(int);
};
class B : public A{
int test(int);
};
int main() {
A* p = new B;
p->test(1);
}
会调用哪个test?(我答B的,面试官问为什么?这个不是虚函数阿应该不是多态呀为什么还是B)(此时已被问蒙了)

面试官:别紧张你就把你的想法说出来就行(心想:快点结束C++吧)

OS:(终于结束C++了松口气)

1.线程进程的区别?

2.为什么要有线程?当时设计操作系统的人设计线程的目的是什么?线程解决什么问题?

3.让你设计一个操作系统你会设计线程嘛?为什么?

4.死锁是什么?

5.解决死锁方法?(回答预分配资源,自己找死说了个线程要访问另一个共享资源时要先释放原先占有资源)

6.你说要先释放原先占有资源?那你怎么保证这个线程的业务完整性?(大型社死现场)

7.i++线程安全嘛?

算法:

lc 1143 (讲了思路面试官表示认可,但说我想太久了)

反问:

技术栈:swift

面试评价:基础知识掌握的不错,基本都答的出来,就是有点太紧张了,然后要更多的去想为什么要这么做,算法思路是对的就是想太久

(二面的穷追猛打面完直接倒头睡到晚上)

隔天中午收到HR电话约了三面。

【三面】(3:00PM, 1hr57min)

面试官人挺好的,也很明显感觉出来是个技术大佬。

自我介绍:

1.http和https区别?说一下TSL握手过程

2.https还有什么安全问题?

3.https怎么保证证书可靠性(答了证书怎么验证)

4.面试官不满意,说我这个是在说有没有被篡改,但我想问的是,证书是一个证书链,权威机构给予子机构权限让他给服务器发证书,怎么保证说这个子机构是可靠的?或者换句话说怎么保证这个子机构发给服务器的时候,服务器怎么知道是权威机构授权的(没答上来)

数据库:

5.SQL注入(数据库不会)

设计模式:

6.设计模式会吗,写一个单例模式(很偷懒的写了饿汉,面试官说要懒汉)

7.好的那这个是DCL,为什么要有两次判断?(拆开来说没有第一个判断会怎样,没有第二个会怎样)

OS:

8.虚拟内存和物理内存的区别和关联?

9.栈和堆的区别?生长方向?

10.堆可以申请多大?栈一般多大?(答:栈默认是4M的样子,堆最大可以和虚拟内存一样大32为元4G,面试官那64呢?我:.....)

C++:

11.说一下野指针,内存泄漏,栈溢出都是些什么?(面试官频频点头看来很满意)

算法题:(凉凉的原因)

无序数组找出所有K, K代表比左边大比右边小的元素?规定O(n)时间复杂度 测试用例是:[2,3,1,8,9,20,12] 输出是:[8,9] (也不知道当时是怎么想的一直书出[9,8])

思路(可以),算法:写出来了但可是输出一直是9,8但虽然K的确是9,8但可是面试官要8,9这个答案让我改(改老半天没出来.....)

其实这题就是lc接雨水的变种题(感谢 生而很菜我很抱歉 的提醒)

反问:

字节针对客户端0基础怎么培养?

面试反馈:基础可以挺好的除了数据库不熟,但你的算法思路怼,也写出来了,搞不明白让反转个答案写这么久还没出来是为什么?所以我感觉你可能代码调试的经验不够(面字节都知道听到这个基本就是凉了),但我们还是会综合考虑的

总结

总结来说基础知识这些问题都基本能答个85%出来。

1. C++还可以在更好一点,而且C++这种比较偏底层的东西面试官可以很轻易地就挖的很深很深所以一定要知其然并且知其所以然

2. 计网的话发现三场面试下来面试官们很注种https的一些安全性和优化方面(当时优化一开始没达好,面试官提示可以往http2.0,3.0去想)

3. OS出的算是比较常规,没有遇到太深刁难的地方

4. 设计模式的话单例模式一定要会,DCL的话也要了解为什么要两次检查,JAVA好像还有个voliate关键字?

5. 算法太依赖lc了,只要不是lc原题就会慌,慌就凉了..............

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值