劳动节之前视频面试过了字节跳动的一面,约我在劳动节后来二三面,二面过了休息十分钟直接进行三面。不过三面的时候面试官跟我聊了几句后问我想在上海还是北京发展,然后就跟HR说把我推荐到上海的部门,三面就先不面了。
先记录一下二面的过程:
首先还是自我介绍,然后介绍一下近期做过的项目,然后问一些技术问题,这里就记一些技术问题吧。
C++:
问:能解释一下overwrite和overload吗。
答:overload就是重载,就是一个类中有若干个同名函数,它们的参数或者返回值不同。overwrite分为两种情况,第一种是基类实现了一个虚函数,子类中如果有同名函数但参数不同,那么基类的虚函数被覆盖,就是在子类中访问不到基类的这个虚函数;另一种是基类实现了一个非虚函数,那么子类中只要有同名函数,基类的这个函数就会被覆盖。
问:多态和动态绑定如何实现。
答:这是通过虚函数实现的。一般的用法是用一个基类指针或者引用去指向子类,然后调用虚函数方法,在编译的时候编译器无法判断指向的是基类还是子类,在运行时候,才能判断具体指向的类类型,然后调用具体的函数,发生运行时绑定。
问:C++里的vector大小是如何变化的。
答:vector在空间用满的时候会新建一个新的空间,大小为原来大小的2倍,然后把原来的数据迁移过去。
数据库:
问:事务是什么?
答:事务就是一组命令,要么一起执行,要么都不执行。
问:事务的四个特性是什么。
答:事务的四个特性是ACID。A是原子性,就是要么都执行要么都不执行;C是一致性,就是事务执行前后数据库的状态保持一致,比如A给B转账100块,转账前后A和B的余额总额要保持一致;I是隔离性,事务之间不发生干扰;D是持久性,就是事务的执行结果会永久保留在数据库中。
问:索引是如何实现的。
答:这个不太记得。。索引就是用来提高查询速度的,我只记得有外键索引了,其他的不记得。。
问:我指的是索引的底层实现原理。
答:索引底层是使用B+树实现的。
问:为什么要用B+树呢,它有什么优点。
答:B+树一个结点有很多子结点,所以相比二叉树它的高度更低,可以减少IO访问次数。B+树是根据B树来的,B+树相比B树的一个特点是它的数据都存在叶节点中,并且叶节点是互相形成一个链表的,比较容易实现范围查找,不需要像B树一样去中序遍历。
问:了解select和epoll这些IO多路复用吗。(感觉这个sockets编程里好像挺常见的,有空去看看)
答:不太懂。。我只知道阻塞IO和非阻塞IO。
问:那说一下阻塞IO和非阻塞IO的区别。
答:阻塞IO就是进程要通过IO访问数据的时候,要一直等待数据返回,在这期间进程一直处于阻塞状态,不能执行其他任务。非阻塞IO就是进程可以请求IO后去做其他的事情,有数据返回后再回来处理。
算法题:
第一个问题:
问:假设有1G数据,一共分为很多行,每行16字节,然后内存大小为1M,要统计出现频率最多的100个数据,怎么做。
答:(思考了一番后)就是分为两部,第一步是用一个map,统计每个数据出现的次数。第二步是用一个最小堆,堆里是pair<data, frequency>,按frequency来排序,大小为100,遍历map,前100个先加进来,然后后面的如果频率比最小堆堆顶的大,就把最小堆堆顶踢出去,把这个新的加进堆里来。
问:这个内存大小只有1M,建这个map空间够吗。
答:(再经过了一番思考)那可以把这堆数据分成几个小文件,比如分成5000个小文件,每个小文件按上述步骤统计,再存回外存中,最后再融合在一起,取出前100个。
问:按什么标准来分类呢。
答:用一个哈希函数,然后可以用hash(x)%5000来取。(这里其实没说完整,哈希函数的参数应该是数据内容,这样才能分开不同的数据)
第二个问题:
问:现在有一些C文件要编译,之间相互依赖,比如A编译需要B和C先编译好,B编译要C和D先编译好……该怎么找到编译的顺序。
答:这个就是拓扑排序吧。
问:拓扑排序是什么呢。
答:拓扑排序就是按照事情发生的先后顺序进行排序。。
问:那这个具体是如何实现的。
答:(经过一番思考后)。。不太记得了
问:就是先找出入度为0的结点,然后去掉这个结点以及与之相连的边,反复迭代。
答:我太久没看了。。有点忘了。
第三个问题:
问:实现一个内存池,说说应该有哪些功能。(我感觉内存池、进程池的问题好像也很常见,回去好好看下)
答:就是实现一个类,然后里面要有内存大小,还有块大小,然后要有创建内存池的函数、分配内存的函数、获取内存信息的函数、清空内存的函数(就是清空分配空间里面的数据)、释放内存给内存池的函数
问:那这里面的内存块该如何管理。
答:就是实现两个链表,一个是用来保存已用内存块的,一个是用来保存空闲内存块的,内存块是一个struct,比如是分页系统的话,这个struct里面就应该有页框,然后还有指向下一个已经内存块或者空闲内存块的指针(其实这题答的不太好,不是很了解这个)。
最后一个问题:
问:编程手写二叉树的层次遍历。
答:(这个其实很简单。。就是leetcode的一个题目,用queue就可以了,就不在总结帖子里写出来了。)
然后让我问问题,我说业务相关的第一面基本都问过了,就想问下三面要等多久,面试官说他去反馈一下,应该过十几分钟就电话联系我了。
然后是三面:
让我自我介绍。
问:为什么要自学计算机知识。
答:一开始是因为觉得计算机知识很有用,就像汽车这方面的一些软件,最后都要编译成C代码,觉得如果多懂一些计算机知识对本专业的工作也有帮助。后来是因为兴趣,因为学这些东西的时候渐渐觉得很有意思。
问:以后想做什么。
答:想做互联网(其实可以说的再详细一点,比如后端开发这一块)。
问:什么时候可以实习。
答:7~9月份。
问:9月份也没什么时间实习吧,学校里应该要上课。
答:现在学校里没什么事情了,应该不影响实习。
问:9月份也应该找工作了。
答:这倒是,找工作倒是有些影响。
问:以后想在北京还是上海发展。
答:在上海。
问:为什么之前没直接投上海的岗位呀。
答:其实我投了。。但是不知道为什么被北京的捞起来了。。
问:那我去跟HR说一下,看看能不能把你转到上海去。
答:上海有岗位吗。
问:头条财经部应该都在北京,可以转到其他部门,我去问一下HR。
答:好的。
过了几分钟。。
问:已经和HR说过了,已经把你推荐到上海的部门去了。等消息就可以了,注意邮箱和短信。今天就先不面试了。
然后三面就这样结束了。
网友评论