字节跳动一面c++视频面试(第二个部门,效率工程部门)(一面通过)

小哥边记录边面试,对于我这菜鸡也挺友好的。由于面试官提前说好了边面试边记录,所以整个过程持续了一个多小时。

自我介绍后

1.如果两个数字以链表形式给出,高位在前低位在尾部,怎么实现加法。(不允许修改数据结构的话)

我:如果考虑O(1)空间复杂度的话,可以先将两个链表翻过来(这样应该很容易吧),然后从头向高位加,考虑进位,然后考虑是不是多一个进位什么的。

问:怎么处理进位呢?

我:弄个变量记录一下

问:必须用变量记录吗?

我:(被这个问题问的有点蒙)不用变量的话可以直接加到高位上,但是这样可能实现起来**&%@,总之用个变量统一一点(说的自己也有点蒙)。

问:那能不能不翻转链表方向呢?

我:不翻转的话可不可以是O(n)的空间复杂度呢?如果是O(n)的话,可以用数组先把数字存起来,也可以用栈来翻转顺序。

(从此就再也没问过算法、数据结构。。。。。。)

2.你有什么项目经验吗?(这个问题问了好几遍)

我回答聊天室和tx的libco学习。(实在是拿不出手)

那聊天室用的什么通讯协议?  TCP

2.5讲一下tcp三次握手,然后问了个tcp求延时的问题我也没搞懂。

3.了解HTTP协议吗?

我:不太了解。

问:......*&^%*&   说一下post和get....

我:只知道是协议头部的一个字段,具体没实现过。。。

(面试官非常恋恋不舍地结束了http的话题,甚至后来欲言又止又想问。。。)

4.数据库了解吗?

我:(http把我打的屁滚尿流,数据库虽然不是很了解,至少开过这门课,就先说了解过一点吧)

然后给我出了个题

有一张表,表头分别是(商品名,订单日期,订单状态),其中订单状态是枚举类型{已付款,未付款,异常}

假如数据量比较大(一千万)

有四种查询操作:

A.查询某商品所有订单

B.查询某天(忘了是某天还是某日期)所有订单

C.查询某状态所有订单

D.查询谋商品最近一个月的订单

需要比较高的查询效率,怎么设计这个表

我:只有一张表吗?

答:是的。

我:(一张表的话,就可以排除各种范式了,提高效率就考虑索引。但是索引怎么加我还是一头雾水,所以......)我对数据库不是很精通所以我可以先从数据结构的方向答一下吗?

如果是考虑效率的话,那可以考虑用空间换时间,数据保存三份,对于第一种操作,在第一份数据里以商品名称排序,这样就可以以O(m)的复杂度(其实这里说错了,应该是O(logn+m))查询到数据,第2,3个查询同理,对于第四种查询,那就按照名字和日期联合排序。

那对于数据库的话,提高效率加索引吧,额嗯...大概三列都要建索引的样子。

面试官:三列都要建索引吗?

我:额.....

面试官:其实第三列是个枚举类型,不太合适没有必要建立索引。

我:嗯嗯嗯......

面试官:以第一列和第二列建立联合索引就好了。

我:嗯嗯嗯......

面试官:那....嗯....你了解过主键是干什么的吗?

我:可以唯一确定一个元组的(当时也没用元组这么专业的名词),而且数据库自动在主键上建立索引。(大概是这么回答的)

面试官:那本题这个表谁可以当主键呢?或者都不能当主键?

我:产品名....不行...(思考若干秒钟,小声嘟囔)。三列加起来可以当....不对。(大声回答,虽然略有心虚)如果是考虑严谨的话,就算是时间精确到一定精度,也可能会有两个订单拥有相同的(产品名,日期,状态),所以这个表不完整,都不能当作主键。得再加一个订单ID之类的东西吧。

面试官:订单ID是么.....(敲键盘记录着什么)

然后面试官又想问一点http,好像是突然想到我不会http硬生生地收回了40米大刀。

“你报的岗位是c++....是吧,那再问一下你c++吧"

5.内联函数了解过吗?

我:“了解过,关键字是inline,相当于把函数直接复制粘贴到了调用处,函数调用的时候有一些问题比如说:调用、返回的时候保存还原上下文(比如说寄存器啊断点啊什么的),需要时间代价,还有调函数可能会导致缓冲不命中造成大量的时间代价。所以对于简小精悍的函数写成inline可以减少开销。但是如果inline函数比较大的话,多次复制粘贴会导致编译后代码过长,浪费内存。(还有其他问题我并不是太懂所以没有讲),总之inline函数跟宏定义有点像吧。大概就是这样子。”

问:那inline跟宏定义函数有什么区别吗?

我:。。。。(真是自作孽不可活,我干什么提宏定义)额,宏定义是定义,inline是函数,emmmmm,用起来的话宏定义一般不能写的那么多。其他的就不懂了。

(之后又提到了inline函数)

6.虚函数和纯虚函数有什么区别吗?

我:虚函数有函数体,可以被调用。纯虚函数没有函数体只是一个声明,不能被直接调用,可以当成一个接口约定来用吧。而且纯虚函数一定要被重写覆盖。之后他俩都会被写到虚表里。

问:如果虚函数被定义成内敛,那么它会被写到虚表里吗?

我:。。。一通推测,然后说没了解过涉及到知识盲区了。

面试官:那你说一下你推测吧,根据已有的知识。

我:(既然这样那我就大大方方推测一番)。inline的话会被复制到各个位置,那么它就没有一个明确的函数头地址,就没法写到虚表里。嗯,我推测:不会。(脑海里记得函数体写在类内的成员函数是默认inline的,然后所以不确定,很迷,事实证明这个忧虑是有道理的,实际情况是两种都有。本作者在这里胡bb各位请谅解

ps:事后问了度娘和CSDN博客大神,是这样的:(我也忘了面试官一开始咋问的了,虽然有点跑题但还是请看官大人多多包涵)

如果这种函数是被指针调用的,比如p->func();由于动态联编的关系编译器不能确定func函数到底是谁,所以不会inline,而如果是被实例调用比如说:p.func(),那么编译器就能确定它是谁,就可以inline。

6.你提到libco,那你能说一下libco是干嘛的吗?

然后胡说一通

问:你提到单核多核,那libco是单核的吗?

我:是的。

问:那你提到高并发,那他是怎么提高并发能力的。

我:(内心想,声网的面试官也是这么问的)此处省略一大段话。

问:你还是没说清怎么高并发。比如说我现在接收到了一百个请求,我一个一个处理和用libco处理*&…………%&……

我:嗯,我先说一下我的一个理解,就是:如果是计算密集型的,适合单线程,如果是计算不密集型的然后是等待比较多,适合高并发多线程之类的东西。如果是您说的每次都要一百个请求的话,那就相当于计算密集型的了。然后举个聊天的例子*&*(*……&%),面试官不太认同的样子。

最后跟面试官扯了半天。

7.你提到协程间不需要锁机制,那你讲一下锁是干嘛的。

8.知道const吗?const和define宏定义的变量有什么区别。

8.5static?static和const的内存地址会变吗?

9.你知道c++中自带的锁吗?(mutex和读写锁)自旋锁知道吗(不知道,对于其他所我只是听说过没有深入了解过,比如自旋锁啊,递归锁啊什么的)

应该还有一些题,有点记不起来了,就先到这儿吧....

面试下来又双双叒叕一次感受到自己太太太太菜了。所以本来是不想写这个博客的。

最后还是硬着头皮写下了这一篇,以备以后复习用吧......

猜你喜欢

转载自blog.csdn.net/GreyBtfly/article/details/88185995