华为od面经(C++)
华为od面经(C++)
流程
5.20 机试
5.21 性格测试(从性格测试到HR面隔了一个月,期间在准备技术面)
6.20 HR面试
6.25 上午11:00 技术一面
6.25 下午6:00 技术二面
6.27 主管面
机考
100分:剩余银饰的重量,字符串序列判定,200分:数组排列求和。前两道题很简单,当时数组排列求和是一道有问题的题目,最高通过率只有50%好像。题目说的是将某个元素插入到某个位置算一次移动,我没思路,就写的是交换两个元素的位置算一次移动,然后也有50%的通过率。如果因为这题导致没过,申请重考百分百成功,我是考了300分,正好过,申请重考的话要等一个月,我就没申请。
性格测试
这个比较简单,网上有很多答案。
HR面(资面)
先做一个自我介绍吧
介绍个人情况,校内奖项,竞赛,毕业之后的去向以及原因......
你的期望薪资?
校内期间参加竞赛的原因和动力?是团体的集训还是自学,为什么这样选择?
你觉得你是天赋型选手还是勤奋型选手,为什么?
问了一些校内的经历
从哪里了解到招聘的这个岗位以及目前对我们的岗位和业务有哪些了解?
等等
技术一面
先做一个自我介绍吧
balabala
你这个项目是自己做的吗?
我是在github上找的,然后看源码,自己再实现一遍。
从简历中挑一个你觉得最有难度的项目,简单介绍一下这个项目
介绍整个项目,对一些有难度的细节展开说一下,说了一下这个项目用到了哪些技术。
你在这个项目中遇到过什么困难吗?
说了一个最后测试的时候程序发生死锁的问题,然后排查问题,分析问题是如何发生的,然后我是如何改进的
还有吗?
有一些困难点没有实现,但是我思考过实现方法。比如如果网络拥塞严重,如何保持正常通信。解决方案就是使用心跳机制balabala
(我说完了停下来,但是面试官也没继续问,好像在等我继续说,我就直接继续说下去。ps:应该在自己了解的地方多说,展示自己技术的深度)
除此之外我还考虑过如何保证可靠传输balabala,还有如何保证消息按序到达balabala
(我停下来,面试官也没说话,我又继续说)
我还考虑过通过增加liunx进程能够拥有的文件描述符的数量来提高并发量balabala
你刚才提到死锁,那你讲一讲死锁吧
死锁要发生必须满足四个条件:
互斥,请求与保持,不剥夺,循环等待。(面试的时候我没想起来这四个名词,但是对于这四个条件都用自己的话解释了一下)然后如果要避免死锁的话可以破坏这四个条件,比如在一个进程开始之前,一次性分配它所需要的所有资源,或者限制进程申请资源的顺序,就像哲学家就餐问题一样,奇数位置的哲学家只能先拿起左手边的筷子,偶数位置的哲学家只能先拿起右手边的筷子。
要避免死锁还可以采用银行家算法,然后介绍一下银行家算法balabala
你说一下进程间通信的方式
管道,匿名管道,消息队列,信号量,信号,共享内存,套接字,文件...
你刚才说你项目中用到了C++的容器,说一下你对容器的了解
C++容器分为关联容器和顺序容器。关联容器有map、set、multimap、multiset、unordered_map、unordered_set,顺序容器有vector、list、deque、string。
顺序容器中vector底层是一个动态数组,每次扩容是以二倍大小进行扩容的。
list是双向循环链表。
deque底层是是由两部分组成的,一部分是一段一段的连续内存区域,存储deque里的元素(每一段的大小是1024字节,面试的时候忘记说这个了),但是段与段之间不一定连续,另一部分是一块用来存储地址的连续内存区域,里面存储的是每一段的首地址。balabala(关于deque的底层实现我很难在这里打字介绍出来,感兴趣可以去自行了解一下,说的时候只要让面试官理解你说的是什么就可以了)
还有容器适配器stack和queue是基于deque实现的,优先队列priority_queue是堆,底层存储的容器在默认情况下是vector,可以自定义元素比较函数来实现大根堆和小根堆。
关联容器中map是一个哈希表,内部元素是有序的,底层是红黑树,红黑树相较于平衡二叉树宽松一点,平衡二叉树要求左右子树高度相差不超过1,红黑树只要求左右子树的高度相差不超过二倍。
set也是用红黑树实现的哈希表,内部元素有序,元素自动去重。
unordered_map就是一个简单的哈希表,内部元素无序。
其他的想不起来了
手撕算法,限时30分钟
技术二面
(我感觉这个面试官应该不是C++语言的面试官,因为整个面试过程完全没问我C++相关的东西,手撕算法只是问我思路,有些C++的语法和函数他问我用法,不知道是真的不知道还是为了考查我,而且我的项目是C++和linux的,C++相关的他也都没问,muduo网络库他也不了解,全是从项目框架和设计思路问的)
先做一个自我介绍吧
balabala
来做道题吧,限时15分钟
手撕算法,leetcode-146.LRU缓存
简单介绍一下你简历中最复杂的一个项目
balabala
把你这个系统的框架,简单画一下吧,用电脑上的随便什么画图软件都行
(打开画图软件,一时间不知道怎么画比较好,突然想起来muduo网络库里的Reactor模型,简单画了一个图,类似下面这样)
我讲一下我这个系统是怎么处理并发连接的吧,因为我这个项目是基于muduo网络库设计的,是基于epoll实现I/O多路复用的,muduo的Reactor是one loop per thread,也就是每一个线程都有一个事件循环,首先有一个main Reactor,负责处理新用户的连接,用户登录成功之后,用轮询的方式把已建立的连接分发给下面的sub Reactor,由sub Reactor处理已登录用户的消息信息,然后如果某个已连接用户的读写事件有耗费I/O的操作,会单独开辟线程来处理。
他应该是没听懂,又问了一个问题,具体怎么问的我给忘了,应该是哪一部分用到了epoll,我又解释了一下,这一部分我解释了很久,他应该是不了解muduo网络库是什么
处理新用户连接和处理已连接用户的消息都是用的epoll,每一个Reactor都是一个循环,只不过main Reactor专门用来处理新用户连接,sub Reactor专门用来处理已连接用户的消息。
你项目中用到了nginx,是怎么用的
我这个项目完成之后,考虑到单个服务器能够处理的用户最大连接数有限,要想提高并发量,最简单的方式就是扩展到多台服务器,然后我就选择用nginx做一个tcp的负载均衡,在nginx中设置一下各个服务器的权重,我是设置的轮询的方式来扩展的,也就是各个服务器的权重相同。但是我只有一个笔记本,所以我只是能够这样设置,没有真正实现。
redis你是怎么用的,中间他问了我很多问题,比如服务器之间直接进行通信为什么不行,你这个项目里用到的redis的发布订阅到底是用来干什么的,我解释了好几遍,下面是整合过后比较完整流畅的回答
因为我扩展到多台服务器之后,用户的连接会被分发到不同的服务器,但是不同的服务器上的用户要如何通信也是一个问题,如果选择每两台服务器之间直接进行通信,那样整个系统的耦合度会太高了,假设有100台服务器,每个服务器要和另外的99台服务器保持通信,会浪费很多资源,所以我选择用redis的发布-订阅模式,也就是每一台服务器都和redis进行通信,如果一台服务器上有新用户建立连接,那么这台服务器就向redis订阅一下这个新用户的id,在有新消息发给这个id的用户的时候,redis会通知对应的服务器,就相当于设计模式里的观察者模式。
所以你这样设计就是,如果有新消息的话,redis还是会在服务器之间进行组播对吧
呃,理论上来说是这样的。(其实不是,redis只会对订阅对应用户id的服务器进行转发,不是所有服务器组播,当时被面试官绕晕了,很多东西他都问,以至于我不知道他到底是为了考查我还是真的不知道我说的是什么只是看我理不理解自己写的项目)
你项目中还用到了MYSQL,是怎么用的
用MYSQL主要是对一些数据进行存储,比如用户表,好友列表,群组表,离线消息表等。(面试官听到笑了一下,“离线消息表,如果用户不在线就存储到离线消息表是吧”,我说对,等用户上线之后去离线消息表看一下有没有给自己的消息,再读取出来。)
其他的想不起来了
主管面(综面)
主管自我介绍,说如果我入职的话,他就是我的部门的主管
先做一下自我介绍吧
balabala
(因为我在自我介绍中说了自己毕业之后的去向和选择)他就问了这样选择的原因
balabala
选择来我们这个地方有什么特别的原因吗,能接受这边的环境吗
我说自己有亲戚在那边,能接受。
期望薪资是多少呢
我说了自己期望薪资(和HR面说的一样),主管说“你这个要的也不是很多,啊,因为你基础比较好”什么的。
在学校期间参加竞赛的原因和动力是什么
一是对编程有兴趣,二是算法是比较基础的东西,可能有些技术很厉害的人算法不是很精通,但是算法很厉害的人技术肯定不差(因为我大学期间参加的都是算法比赛,蓝桥杯一次省一,一次省二,团队天梯赛一次省二一次省三)。
你说你对编程有兴趣,你大学期间不算做作业和课程设计,自己基于兴趣写的代码量有多少
有很多小项目,有一两千行吧。
这一两千行也不算多啊
(感觉有点压力了)是不算多,但是我觉得代码量这个东西不是很有代表性,然后讲自己考研期间系统复习408的收获,自己动手写项目的收获等等,意思就是要思考,如果写的多不思考那么代码量也不具备参考性,就是表示一下自己基础好(因为前面主管说我基础比较好,我就顺便夸一下自己)
主管说对,然后说了很多,我就一直嗯嗯,对对
对od有什么了解吗,因为外面现在对外包的评价都很差
我了解到od的员工是和华为的员工一起办公的,很多地方会每周一二四加班到八点半下班balabala
夸了一下华为od,说自己能接受加班
主管说,虽然你没有工作经验,但是你对行业还是很了解的嘛,然后主管说了很多,感觉这个主管很健谈,期间我就一直嗯嗯,对对,是的
你还有什么要问的吗?
我想知道如果我能入职的话,我现在学一些什么能对我之后的工作有帮助
主要是linux调优什么的,然后介绍工作语言C和C++各一半balabala又说了很久
(因为我之前说考研的时候说父母不支持自己考研)我还是想知道你父母为什么不支持你考研
父母想让我早点工作,我是想第一份工作找一份比较满意的balabala
又问了我的性格,爱好等等
其他的想不起来了