首页 > 笔经面经 > 去年10月找到现在,真心面不动了。面经回馈牛客

去年10月找到现在,真心面不动了。面经回馈牛客

头像
十年命换鹅厂offer
编辑于 2019-03-16 08:32:21
赞 26 | 收藏 132 | 回复16 | 浏览3332

首先谢谢牛客这个平台,无论是面经还是offer求比较,大家都很热心。一路走来也认识了不少人,发点面经给后来的学弟学妹。


本人双非渣本,Bat之类的只投过腾讯的实习,当时还是大三下学期,也是第一家。没有什么准备,很简单的两个问题没答上来。面试官给了不怎么好的评价估计拉黑了,后面秋招杳无音信。所以学弟学妹们找实习那一次,尤其是大厂,一定要慎重。


一直的意向工作找一份后台开发,C++方面的。

注:以下面经来自于自己的记录,以及群里和人吹牛逼翻出来的一些。可能都不太全。


三七互娱(一面挂)

当时秋招的第一家,也没现场面的经验,从一开始就很慌。

了解rtp之类的传输协议吗?不了解

讲一下Hash的原理,冲突解决(取模,开链闭链)。

Map用过吗,用过。原理,红黑树。

为了表现自己赶紧说我能手写。写完插入感觉面试官不太耐烦。说:那写个删除吧(gg)

一到一百少了一个数,少哪个?

map扫描两次,就可以知道了。然后不行,面试官说再想想,没想出来。

面试官说有个O(n)的方法,回去自己了解一下。另外你知道set吗?为什么不用set可以省空间。我说忘了。然后等通知……


迅雷(一面挂)

当时西安场人特别多,小哥哥太忙了估计,就给了15分钟时间。

Hash表的桶知道吗?桶数一般是个素数,为什么这样设计。不知道,可能为了散列均匀一些吧。

问了些模板之类的问题,为什么声明和定义放一起。不知道

讲一下深拷贝浅拷贝。当时就傻乎乎的说深拷贝重新开辟空间,浅拷贝指针指向一处。也没主动往下说好处坏处应用场景。

原地反转单链表,写了半天,写错了

写了个结构体,占用多少内存。这个当时会算内存对齐,但是慌张之下忘了double多少个字节,怎么对齐忘了。

然后等通知gg


回来开始看书,听说有本剑指offer?厉害了,还没看几个题,小米打电话叫面试。


小米(二面挂)

笔试做的一塌糊涂,然后收到了面试。

一面:

进程3种状态,怎么切换,之间的关系(把书上阻塞运行就绪画了一下)。

手撕求二叉树最大直径(递归,这个很简单)

手撕求翻转数组翻转点(二分加快速度,也很简单不说了)

const用法,底层顶层,指向什么不指向什么,什么可以改,什么不能改。const可以用来重载。

怎么杀掉进程(Ps ef,kill 9)

快速排序,思想。怎么优化(最好的方式三向切分,然后少于15个数时候切插入,递归层数过深的时候切堆排序,轴值的选取用三个数取中间)。

动态链接,静态链接,动态装载相关……

这一面找回了点自信,门口和老哥吹了会儿牛逼去二面了。


二面:

上来怼项目,项目很水,没怎么说。

Linux支持异步io吗?不支持

三种访问权限的区别,然后public,protect,private的继承方式下子类的访问权限。

引用和指针的区别。本来已经介绍完了。我忘记前面挂的惨状了,又得意洋洋说了句引用就是一个顶层const。然后:??你怎么知道?反汇编出来的代码一样吗?汇编层面怎么表示。

我:……

手撕代码:给定s1和s2串,从s1里面删掉s2出现过的。我一开始哈希表,然后开一个空间从第一个里把另一个里面没出现过的push进去。

面试官:这个哈希表256没必要吧。我,没有必要没有必要。

面试官:那多少。

我:128吧,就128。

面试官:呵呵

然后没再多问,让写一个不用额外空间的。写了,感觉还算满意。

手撕算法。下一个排列。提醒了3次才写出来。

然后面试官怀疑的目光落在了我简历上的sql上,说你会数据库?我当时真的害怕再有一个答不上来惹着他了,赶紧说没有没有,不会,真的不会。

然后出来签到发现挂了


当时面小米问的我心情毁了一半,出来蹲在地上一根接一根抽了半包烟,想到了前面的三七迅雷。就一边抽一边一直在想,我是不是真的太水了,不配来互联网。我还到底要不要面了。我说不想去电信移动,因为大学四年就白学了,但是我这四年到底真的学到东西了吗?哭着给学姐发微信说我不搞了不搞了,我可能真的配不上,我也坚持不下去了(当时做了不少笔试都没消息,唯一有面试的还没面过去)。结果学姐就回了个没事加油。我当时就来气了,md,我搁这哭的一把鼻涕一把泪,你在这敷衍我,很生气。


回来以后面ucloud,就一面,但是面过的同学应该都知道这家公司秋招搞了什么操作。


Ucloud,一面。

数据库四种隔离级别,分别举例子,每种在上一种的基础上加了什么锁(很简单不说了)

malloc之后发生了什么(查内存池,brk,sbrk系统调用)

Elf头,每个段都讲了一下,text,data,bss。顺口说了0x80480000

Tcp,坚持计时器。keepalive计时器。

写了一个shell命令,列出重复数据。awk+unique+sort很简单也不说了。

其他的一些忘掉了,总体答的还可以。后面没消息了。

禁止堆构造。(operator new私有)

禁止栈构造。(析构私有,狠一点的全部私有)


同学说你tm再不刷算法题,你身上其他的就白白浪费掉了,我说,哎我其他的也是辣鸡,你奈我何?然后偷偷开始刷算法了。


深信服(3面offer)

一面:

知道allocator吗?知道,然后分配内存怎样,内存池?我答sgi那个二级空间配置器。

Vector自动扩容,我顺带着把迭代器失效也讲了。

我说源码剖析这本书我倒背如流,你随便问,他说哈哈哈哈那就不问了(其实问个map我当场去世)。

Tcp三次握手四次分手,失效的连接可能因为什么情况失效,为什么失效。time wait出现在哪一方。作用。close wait哪一方。ack和seq的关系(真tm变态)

判断一个机器大小端的方法

手撕代码,正则表达式判断固定开头固定位数的qq号。

Static关键字作用。

udp可以connect嘛?当然可以,连接了以后io函数换成tcp的,再连接断开连接。

防ddos,问懵了,没答上来,感觉有点突然。

求链表是否有环


二面:

两个队列实现一个栈

1到100多了一个数,求问哪个?我直接就说了5050。伤痛历历在目😂

有一个字典,给一个单词判断是否在字典里。答布隆过滤器。回答会误判,让我说误判的原因,说完让我换个办法。说了字典树,占用多大空间。怎么标记。还好不是现场面,这玩意估计一时半会写不上来。

strcpy,memcpy。老生常谈了。

拷贝构造的参数是什么?引用。为什么?防止无限递归。

C++11特性,能说的都说,哪个最重要你认为?我说了auto,delctype,初始化列表,右值引用,加入了哈希表之类的。右值引用最重要,其他的都是奇技淫巧,主要是在各种容器类中避免了资源拷贝,提升效率。std move的原理,其实就是一个static cast。

写了个sql,没写出来。

问了网络编程的信号量,写一个被关闭的套接字怎么样?sigpipe默认处理方式是什么?怎么不让程序down掉,signal和sigaction的区别。

Tcp各种计时器,滑动窗口,重传策略,书上老掉牙的一顿怼。反正过了。


三面:

红黑树好处,三次翻转之内平衡。怎么做到的?答左旋右旋染色过程。

红黑树最大不平衡度,怎么来的?答其实这就是二三树,二三树是平的,那分一根出去做节点肯定差出来一倍。顺口说了一下红黑树一些特点(算法4这本书红黑树这一章值回书价,没买的赶紧去买)。

浏览器访问过程。dns解析过程详细说说循环递归什么的,然后请求资源啊什么的。然后开始解析渲染什么的。

i++i+i++i之类的玩意儿求值过程(画语法树手写最右推导)。

之后就给offer了。感觉emmmm没传说的那么难


58同城(三面offer)

一面:

面试官是小姐姐,后面去实习了才知道真的非常厉害的小姐姐。

Java和c艹的区别,解释型编译型,库多库少,运行效率,跨平台特性。

Linux内存空间地址,逻辑地址,物理地址的关系。栈从哪开始,堆从哪开始。向什么方向增长。

浏览器输入……

Mysql隔离级别……

Linux下的一些命令

C艹类型安全吗?不安全,因为指针,reinterpret cast各种骚操作

进程间通信方式,线程间通信方式,说烂了都我就也不提了。

问我nio,我说不懂啥是Nio,她说就是同步非阻塞io(点赞有耐心的小姐姐),然后多路复用讲一下,select,epoll的对比。然后说了5种io方式,同步阻塞,非阻塞。异步,信号驱动,多路复用,每种怎么实现,优点缺点。对应的空轮询坏处讲一讲。

http状态码,从100一口气说到500多。

单链表是否有环

感觉问的很水,当时觉得女面试官估计也是打酱油的,但是幸好去实习了,发现真的强,去阿里给个p8不为过。


二面:

跳楼梯,斐波那契数列。

过滤手机号,我说了字典树。结果这个面试官想听的是布隆过滤器(服了)

写了个sql,查找前多少行,加limit就行。

数据库去重distinct

用过缓存吗?用过。为什么快,因为读写内存。又不带锁。为什么不带锁,因为单线程。redis单线程的意思?epoll讲了一下。感觉面试官忙去了,换了个人来面。


三面:

一上来就是一个去重,说了内存能放下和放不下的情况。

能不能再快点?不知道……

又是一个几个T排序,说了桶排序。问桶最多能有多大(其实是问32位uint),然后说至于吗?我说至于,因为反正都是几个T,哪怕是1到10重复几个T,桶排序也不会比你分文件哈希慢。

epoll(妈的从来没人问过我都快忘掉了),说了一下水平触发,边缘触发。什么情况接着读,什么情况接着写。epoll用到的数据结构,红黑树怎么放,什么时候挂到链表上之类的。blabla。发现没忘完还好还好。

两个几万个url的文件,找相同。分文件哈希说一说。

撕了一道算法题,视频写代码。题目忘了,反正交换数组元素的时候尽量写异或交换就行了。感觉能装逼

就能想起来这么多吧,58也给了offer。秋招第二个offer,跟各位大佬没法比,这个offer真是救了老命了。把我心态拉回来了



滴滴(hr面挂,必须展开说)

一面:

数据库分库分表,垂直水平。

Redis哨兵,不会

一致性哈希,大圆环不多说了

什么样算好的哈希算法,一个输入改变,影响到所有输出bit位的改变。算的过程也不能太复杂,可以充分利用循环展开,局部性的比较好。讲一下循环展开原理,不过写代码的话没必要,编译器自带优化。再讲一下局部性原理,空间,时间。尽量避免非一致性访存,然后讲了一下numa,linux下的开启关闭命令。

扛高并发的方式,dns轮询,Nginx反向代理,还有从协议层面的Lvs。

Redis或者memcache之类的,能不能搞长连接?这个地方我不知道他本身能不能搞,我回答了可以用unix native socket实现进程间通信来搞,然后答了一下本地套接字好处。

面试官以为我没懂他的意思,直接问短连接,长连接,连接池的区别了。然后就是http2的多路复用指的是什么。这地方太多了不打字说了。

说一种面向对象设计思想,我回答了vfs,然后就介绍超级块,inode,目录这些东西。链接哪里,分别需要重载什么函数。

然后开始了长达一个小时聊人生聊理想,我尽量长话短说。

面试官:你写的这个异步网络库(基于kqueue)我看了,我看你项目中也有用到asio,你这个网络库是仿asio写的吧。为什么不直接看看asio源码呢。我……

面试官觉得写的一般,但是因为那是大三写的,所以跟我探讨。说现在让你修改你会怎么修改。

我:当时就当玩具写的,现在写的话会考虑多线程的情况,这个队列会加锁。用循环队列。

面试官细节扣的很死:链表还是数组,怎么提高效率。

我说了很多情况,包括链表插入空节点分开表头或者表尾,这样可以用cas不会锁住整个队列。或者用队列长度选择2的整数次方,减1相与避免求余的计算。

面试官:cas安全吗?有什么问题,怎么避免。

答:不安全,ABA问题,可以加版本号用双cas。

对了,之前面试官让设计一个数据结构,用id怎么o1的时间内定位出来函数指针以及参数。

面试官还算满意,问了cas的缺点,什么样的情况下应该用mutex。我说抢类似那种类似文件资源可以用。但是生产消费者模型肯定不能用,无论是mpsc还是spmc或者mpmc都不能用。mutex陷入内核影响效率只是一方面的原因,更重要的是抢到mutex的线程一旦被调度,整个进程全部卡死。讲了可以用队列,好处是可以原子操作,这样整个程序都是wait free的。

面试官说链表也可以加原子操作的。问了一些原子操作方面的编程陷阱,主要是指令重排导致的问题。回答加内存屏障,保证指令可见性。

总结:我感觉这个面试官非常强,人也非常好。中间有一两个说的自己有点晕了。面试官耐心等待,引导。面试体验非常好,让我觉得仿佛在和同学讨论高数题。给我说:"多线程环境下的编程是非常具有挑战的东西,不仅自己容易绕晕,而且一旦出了bug复现困难,有的东西跑上100次可能就出了那么一次,下一次再出搞不好就是生产事故。大量的共享互斥操作,怎么在效率和安全性上取舍之类的"。记不清了,最后给我说不论能不能进滴滴,不论以后能不能写这方面的代码,都希望能当个爱好培养下去。


二面:

stl六大组件,容器,迭代器,仿函数,泛型算法,空间配置器。还有一个这会儿想不起来了。

线程安全性,stl所有东西都不安全。

缓存击穿,穿透。

一致性哈希。

双写一致性,写删,删写。冲突窗口是什么。

怎么统计网站pv(set计数),uv(数学推导很复杂,直接说了redis的hyperloglog)面试官说可以。

Redis持久化。追加写和snapshot。

Redis的锁,问的挺多,锁没释放,提前释放都说一下怎么解决。

数据库聚集索引,非聚集索引。联合索引。问的很细。关于b树原理,最左匹配这些。

innodb的特性,行级锁,支持事物,备份难(binlog增长起来还是蛮痛苦的)。然后查询优化(Count*之类的,select多的话还是得myisam)。支持mvcc。大概说了这些。

Redolog写入时机,事物开始时就写入。

分布式一致性的级别,严格一致,顺序一致性。最终一致性。现在不大记得了,同学们自己百度哈。

乐观锁指的是不加锁吗?不是,只是说不在代码层面加锁。数据表肯定会被引擎锁(没有mvcc的情况下)。

雪崩了解过吗?怎么预防?只回答了重试一定次数断开连接,让下游缓一会儿。

说一下负载均衡的几种策略。随机,轮询,加权做算法等等。好处和坏处。

了解zookeeper吗?不了解,不过我们云计算学过chubby,然后说了一下租约过期,选举,序列号,半数通过之类的,看面试官反应应该意思差不多,

什么是缓式评估(我说了redis的rehash过程,linux下fork的写时复制)。面试官说可以

手撕算法,最接近的三数之和

手撕算法,Lru cache

最后说1面的面试官说你想写多线程编程。我看你架构也了解一点。更有兴趣做哪个?


Hr面:

我看你17年就过了4级,现在怎么还没过6。不学英语了嘛?

我说我没再考过了

为什么?

因为我从小到大所有考试都是一次过的,我不想打破不败神话。我觉得我考不过去

她说失败总是难免的,应该接受

我当时感觉过应该很稳的,就中二了一把:我宁愿什么都不做,也不要犯错



好未来(三面offer)

一面:

Linux进程和线程的区别,答没有区别,从内核角度来看调度的单位都一样,都是task struct。讲了一下怎么创建task struct,dofork和clone的时候共享了什么,不共享什么。再问那为什么主线程没了,其他也跟着没了。然后讲了一下linux thread和NPTL线程模型,管理线程的弊端。反正这个讲了好长时间。

手撕代码,求01矩阵最大正方形面积

手撕代码,归并排序

因为那个线程拖的太久了,这一面没问啥其他问题就这样过了。


二面:

Tcp四大定时器,client和server如果一方掉线会怎么样,掉线重连会怎么样,进程挂了怎么样,宕机了会怎么样?什么时候发送rst,收不到RST的话重试多久?这地方问的很细,我怀疑他手里拿着unp在那睁眼打瞎子

软链接和硬链接的区别,我从inode引用计数的角度来答

Linux下信号量,怎么屏蔽,知道哪些不可屏蔽的信号。我把他知道的他不知道全说了一遍。

双向输出重定向

手撕代码tcpdump监控指定机器指定进程

手撕代码啥东西忘了,一个贪心算法好像是。

虚析构函数,虚析构得调用顺序。

extern c

memset(this,/0,sizeof(*this)。我从有无虚函数,有无对象成员,是否pod的情况来说。不过面试官说我漏考虑一种情况。至今为止不知道漏考虑啥了。


三面:

手写单例模式,懒汉式就常用的,双重判断,为了堵死他的嘴直接用了new的nothrow版本,再判空指针。然后还是没堵住,说不准用新特性,安全吗?我说在外面catch异常,那个锁上加guard_lock。他不说话我突然想起来guard_lock也是新特性。那就手写构造析构自己实现RAII。感觉面试官很满意

这里顺便说了智能指针,循环引用,unique_ptr这些东西,然后unique_ptr的删除器简洁写法?lambda表达式。问了值捕获,引用捕获。

异常安全呢?了解吗?然后讲了三种等级。面试官又问,强烈保证靠什么实现,答标准库swap不抛出异常。

手撕sql,一个表中符合条件的人成绩+1。

手撕sql,一个表中男女性别交换。

面试官说感觉我写代码很健壮,感觉挺有经验,期待和我当同事。他根本不知道我一行都没写过,全是背的。而且你写代码这么奇技淫巧,哈哈哈我可不敢做同事😂😂


拼多多(两面挂)

很气愤,快过年那会儿被捞起来的,感觉过年加班自己不开心,从池子里捞个人消遣消遣。一面问go,二面问c++

一面:

Golang里的main函数是进程吗?不是,也是一个协程。

Golang比较两个结构体

Golang的map,json,struct相互转换。

Defer的用法,执行顺序。

Slice的append方法,注意连续赋值。因为这玩意底层和c艹的vector有点像,不赋值就失效了。

Channel怎么实现的,队列。

select的用法。

简单说一下mpg调度模型吧,你自己知道什么调度模型。回答了work stolen模型,一个本地队列,一个远端队列。跑完自己跑远程的。本地从头取,远端从尾取避免竞争。除非所有系统线程全部睡死,不然不会有协程因为别的协程阻塞。

Go的内存分配。这个我知道TcMalloc的,就照着说了。都是谷歌出品应该差不多。讲了一下分配内存要注意的地方。每次多申请一些不然刚好放进本地就没了,再申请还要加全局大锁影响效率。

本地内存池怎么实现的,我说肯定链表啊。后面反应过来问的是Thread local线程本地变量。

Docker的实现原理,有哪些namespace。aufs的写时复制。docker四种网络模式,只答上来bridge和host。因为其他也不常用。

Docker镜像有自己内核吗?没有

原地反转单链表

二叉树层级遍历


二面:

了解RPC么?用到了什么技术,答linux零拷贝,减少用户空间拷贝(对应函数sendfile或者mmap)。然后序列化吧,回答了protobuf,说了支持的数据类型。编码方式,压缩效率之类的。

new的过程。operator new->空间配置器->malloc->glibc的malloc/tcmalloc->brk/sbrk/mmap->new operator。问sbrk分配了内存空间吗?没有,只是在进程范围内提供虚拟内存合法访问地址。要mmu映射,缺页中断,物理内存分配。说了一下伙伴算法。

Const用法。

用过iostream迭代器吗?没有

分布式事物怎么做?说了个2阶段提交,问了一下详细过程。然后可能得问题(单点,commit时断网)。怎么解决一致性问题,答3阶段提交。

面试官语气一变,3阶段提交能保证吗?我说能。他说不能。你还知道别的方式吗?emmm,本来想说paxos,但是刚有人跟我说过paxos和三阶段提交是一个东西。然后半天没说上来也不敢吭气。

中间有个问题忘了怎么开始的了,就关于epoll wait多线程下惊群的问题。哪个版本修复的?内核修复的还是epoll修复的?一套素质三连我哑口无言

虚表,这个我倒背如流,当年腾讯就栽在这上面了。做梦满脑子都是虚表。


后面问了一道算法题也没答上来。


vivo(已签三方)

1面:

Stl六大组件

单线程reactor,eventloop这些事件模型。

Apache和Nginx区别,一个fork多进程抗不了太高并发,但是能处理后台程序。一个epoll多路复用能抗是能抗,但是处理静态页面效果更好,因为调用cgi程序会阻塞后面的,所以不是很好。

算法题,two sum

好像就没了,哎,就这样面进来了真是……


总结一下,秋招开始一直觉得自己是辣鸡,bat之类的想都没敢想过。就面了这几家,还有很多很多自己也想不起来了,比如redis的zset限流,c艹的类型转换。linux下各种命令,futex实现用户态高效的join一个线程等等。都想不起来谁家问的了。总体就面了这几家。现在想想假如当时投投阿里百度什么的,说不定运气好也能进去。哎,有点可惜,不过vivo也挺好的。我们深圳做兄弟。


我就是饿死,跳下去,0offer,穷死。头条也别想收到我一份简历。哼


鹅厂啊鹅厂,怎么就不给机会了呢😭😭😭


16条回帖

回帖
加载中...

本文相关内容

近期热帖

热门推荐

扫一扫,把题目装进口袋

牛客网,程序员必备求职神器

扫描二维码,进入QQ群

扫描二维码,关注牛客网公众号

  • 公司地址:北京市朝阳区大屯路东金泉时代3-2708北京牛客科技有限公司
  • 联系方式:010-60728802(电话) admin@nowcoder.com
  • 牛客科技©2018 All rights reserved
  • 京ICP备14055008号-4
  • 京公网安备 11010502036488号