秋招在今天就算结束了,近几个月在牛客上学习,现在也算是回馈一下牛友们。
秋招运气比较好,拿到百度、阿里、腾讯、华为、360、美团、小米的(准)offer,不过都是意向书。。。。非正式。攒波人品,等国庆后的结果吧。
本人本科211,硕士末流985。实力很渣,实验室项目也不行。全靠研二的时候,研三的师兄带路(他们工作确实找的好),他们分享他们的招聘经验、学习资料和方法等,还有就是研二的同实验室的同学的帮助也至关重要,所以研二这一年时间还算没有浪费,基本都花在学习、项目。算是给我们一个很大的指导作用,在这里真的很感谢他们。
我个人的简历、笔试、面试情况:(时间顺序 7-9月,我全是提前批,除了腾讯、美团)
1、多益网络(一面) offer (确实出乎意料,有点略水,就一面。。。)
2、oppo (一面、二面) hr面挂(估计跟着前面的人吼价格 吼高了, 跪了。。所以谈薪还是要慎重)
3、阿里巴巴(钉钉团队) (终面、附加编程面、交叉面、hr面) offer (之前拿到实习offer,人太怂没去。这里给后面投阿里的同学一个建议,一定要投实习,因为阿里秋招很喜欢从实习批的人录取,走绿色通道)
4、百度(企业云团队) (一面、二面、三面、性格测试、hr面) offer (这个挺看运气,面试官人不错)
5、网易(云音乐) 笔试挂 (投网易的云音乐要慎重,头的人太多,不够出彩就别去尝试,浪费机会,个人看法)
6、网易互娱 笔试挂 (虽然三道全部AC了,但是估计全AC的也比较多,双非等限制,后面就没有面试的邀请了。。)
7、奇虎360(安全卫士后台团队) (一面、二面、hr面) (面试官人挺好的,我觉得我挺多的都不会,但是还让我过了。。。可能c++那一块答得不错,这个确实看运气)
8、华为(cloudbu团队,优招批)(业务面、技术加面、总裁面)(华为玄学面试,全看运气)
9、拼多多(基础平台,提前批挂) 校招批笔试通过,至今没面试,算挂了吧
10、小米(java的一个电商后台,做订单系统的) (一面、二面)(笔试没做,还是发意向了。。小米和头条差不多,强调手撕代码,我撕了4道,有道算法不会做的,面试官把算法和数据结构都给我说了,,,还好我写出来了。。这个面试官真的不错,我就喜欢这样的)
11、头条(笔试4.3AC) 一面挂 (一轮游,还是太菜,手撕了一个比较一般的题,写了25分钟,虽然跑过了所有测试用例,面试官还是把我挂了。。其他基础都没问题,所以。头条还是重code。如果想进头条,刷leetcode、剑指offer吧,这个是面试官给我的唯一的建议)
12、美团(餐饮链 java团队 一面、二面、三面、hr面,这个是校招批) 口头offer (一面code差点没写出来,估计没写出来就凉了。。。运气。美团主要是看个人思维、技术等,不限语言,所以是c++的伙伴也可以考虑美团)
13、腾讯(sng数据中心团队 一面、二面、hr面今天走完了 这是校招批) 等结果(hr给我说 每轮评价都很好,应该没问题) (之前腾讯提前批挂了,算上实习面试,我腾讯的面试记录都有4、5个了,大部分差评价,所以根据我的情况,有的小伙伴不用担心面试评价的问题,还是要简历要做好)
后面就没有面其他公司了。希望我今天的分享能给腾讯攒波人品,我最想进的就是tencent。。。。腾讯情结 -.-
下面是我个人的一些建议和面经吧,分为几个板块:(可能也不适用于一些人,当看着玩吧)
1、书籍推荐
2、学习氛围
3、简历修改
4、面试技巧
5、面经分享
---------------------------------------------------------------------------------------------------------------------------------------------------------------
书籍推荐
c++ : 《effictive C++》、《SGI STL源码解析》(侯捷)、《effictive STL》、《深入探索C++对象模型》、《c++ primer》等
网络:《计算机网络》、《图解tcp/ip》 、《tcp/ip详解》、《UNIX 网络编程》(想进腾讯的小伙伴最好看看这个)
***作系统:《深入理解计算机系统》、《***作系统-精髓与设计原理》、《UNIX 高级环境编程》
数据库:《高性能MySQL》、《Redis实战》(我没读)、《数据库原理及设计》
数据结构和算法:《剑指offer》、《数据结构及算法实现》(名字我可能记不太清)、leetcode(我就只刷了100道,算是我们实验室刷的最少的了)
实战:《Linux多线程服务器编程-使用muduo C++网络库》(陈硕) (这本书强烈推荐,从实战的角度分析处理问题,我们实验室都看了这本书的)
其他。。。。
学习氛围
主要说说我的情况吧,导师这边要做项目,我的项目比较少,所以有更多时间看书;其他同学有项目,但是他们也抽空闲时间看书。基本晚上9点半才从实验室回寝室吧。这里还是强调不要单兵作战,我们这届实验室的同学跟上届师兄一样,抱的比较紧,有什么问题可以互相问,解决的过程中就可以相互提高了,每本书的学习,每个人的理解程度都不一样,理解的角度也不一样,我们一般都会进行交流,使得学到的知识更加全面吧,学习效率也比较高。在招聘这一块,我们一般有什么招聘信息出来了都相互传播一哈,大家能够第一时间了解到招聘信息,笔试面试都有同学一起去,没那么孤单。
简历修改
我个人的观点吧,看看就行。我觉得简历主要还是一页就好,简单明了,最好是第一时间就能让面试官知道你会什么。整个页面干净、有条理就行,不用彩色的条纹那些(尽量别在外观上浪费太多时间)。除了一般要写的个人基本信息、荣誉、学历、项目以外,做技术的同学,建议就是再弄一个 技术栈的模块出来,比如c++会哪些、网络会哪些、数据库会哪些。这样简单明了,我腾讯和美团现场面的,我看到的就是面试官其实就是一条一条的对着我的技术栈一个一个问的。此外在字眼的使用上,好好注意把握 “了解”、“熟悉”、“精通”,一般建议写“熟悉”,不太稳的写“了解”,高手都不建议写精通,一旦有一个不会,面试官的印象大打折扣,觉得不够谦虚。照片的话可贴可不贴。我就没贴,主要人太丑。。。很尴尬。
面试技巧
说实话,我个人的技术实力真的很一般,在实验室我都算排在后面的,实验室大佬太多,在技术上我就跟着学,偷学一波技能。我觉得我的优势在于面试技巧上,在面试的时候,我觉得要善于引导面试官,俗称“带节奏”,其实就是与人相处交流的一些方式方法了。
首先是自我介绍,我觉得自我介绍个人信息不用太详细,就说个名字 学校 专业 即可。其他信息面试官也看的到,没必要说。如果是计算机专业的 好学校的 建议说出来,突出一下,给面试官一个好印象。 然后下面应该直接简单明了的告诉面试官 个人的技术栈,给面试指方向。不然面试官真的有可能瞎问,问到会的还好,不会的就容易凉凉。在下面可以说你的项目,大概提一下即可。
技术栈介绍:首先主动引导面试官问那方面的问题,在回答问题的时候,故意带一点其他的你会的知识点,可能有的面试官就会心血来潮问你那个引子。比如我给面试官介绍我的项目框架的时候,提到了epoll,他就问我epoll 和select区别、lt et区别,这些都是准备好的,自然你也就会答得出来。这算是套路面试官吧。如果遇到面试官问道的问题不会答,也不要慌,可以用这样的语句:“不好意思,这个我没太了解,不过我知道与这个相近的xxx,你看我给你分享这个xxx的个人体会可以吗”,有的面试官就会同意的,这样不容易题目被带偏。 还有就是如果就是真的不知道的,就直接说不知道,这个没什么的。比如 面试官问我 你数据库怎么样? 我一般都说,不太会。 一般面试官就不会问了。如果你掌握的不好,你说还可以,那他问你结果都不会,就是一直吃 暴击伤害。。。面试官印象很差,还不如直接说不会。
项目:主要要分析清楚,条理清晰,面试官并不关心你的项目如何如何渣 如何如何叼,在于的是你对项目的思考和理解吧。
面经分享(内容不全,后面也没时间写面经了。格式不太好弄,笔记上copy过来的,将就看吧-。-)
可能也有些有错的地方,欢迎牛友指正。
多益网络
1、项目部分(似乎对muduo更感兴趣)
介绍了项目功能、架构
muduo有哪些精彩的地方,说一下。 吹了一下异步日志的双buf的实现、buf本身的readv 的性能
2、基础知识
1、linux IO模型(5种) 记不太清,说了几种,应该没说完。(应该是:同步阻塞、同步非阻塞、多路复用、信号驱动、异步IO)应该还要说细节
2、静态链接库和动态链接库的区别
3、什么是线程不安全
4、c++ 继承和组合 ,为何优先使用组合(这个我不知道理由)ps:应该是组合能实现和继承一样的功能,但是对于父类对象,在组合中是不会暴露细节的,相当于是黑盒,而继承是“白盒”。
5、什么时候使用链表或者队列?(增加、删除频率较高的场景)
6、c++ const的作用? (变量和函数两方面 mutable)
7、百度地图如何实现实时路况
8、快排算法 稳定性
9、函数指针的使用场景、好处。使用于回调函数 虚表指针就是例子
10、你会用什么结构来查询?(hash表、map、 set这些)
11、tcp udp的区别 使用场景
12、什么是缓冲区溢出
3、编程
数组循环右移 将一个长度为n的数组A的元素循环右移k位
比如 数组 1, 2, 3, 4, 5 循环右移3位之后变成 3, 4, 5, 1, 2
4、其他
1、如何看待加班?
2、你的爱好是什么?玩什么游戏?
3、你最近在看什么书?
4、你还有什么要问我的吗?
腾讯OMG团队(实习)
1、画出tcp头部的协议格式。
扩展: udp头部、ip头部、http头部
2、Http的报文头部
3、数组和指针的区别
(1)数组本身体现出来的就是一个 指针常量的 “特性”,即不能对数组的首地址进行修改,内存上的地址就已经是确定了的。而指针本身是一个变量,他指向了一个地址,这个是可以变化的,也就说他可以重新赋值指向新的地址;
(2)当调用sizeof函数时,对于数组,得到的是数组元素个数*数据类型的大小,而对于指针,得到的是指针类型的大小,这个取决于机器的位数,比如32位机,对应的指针就是4字节的大小;
(3)指针相比数组更加灵活。
相同之处:比如当作为形参的时候,定义成 指针还是数组都是一样的,因为这个时候传入的都是数组的首地址,也就是这个数组名,反映出来的就等于是一个指针。
4、参数传递的方式
值传递、引用传递、指针传
5、c++种struct和class的区别
(1)如果不申明访问权限,class的默认权限是private,而struct是public
(2)对于继承,如果也没有明确是public继承还是private继承或者是protected继承,class
默认是private的继承,而struct是public继承。
(3)从抽象上来说,class更像是对象的实现体,而struct更像是数据结构的实现体。
6、构造函数能不能是虚函数?
不能,因为类对象中占前4个字节的虚表指针 需要在构造函数完成之后才会生成,通过 虚表指针才能找到虚函数表,访问调用对应的虚函数。如果构造函数是虚函数,那么就只能通过虚表指针才能访问到,关键是此时就需要让构造函数产生出虚表指针。陷入了先有蛋还是现有鸡的问题
7、析构函数可不可以是虚函数?
可以,而且如果说这个类不是final的,也就是说他是某一个类的父类,那么该类的析构函数必须是虚函数,因为如果不是虚函数,那么其子类对象的父类组成部分将无法得到释放,造成资源泄露。
8、析构函数可不可以是纯虚函数?
我觉得不建议是,因为我们知道纯虚函数是没有实现体的,那么子类对象在析构的时候,父类组成部分就没办法释放,显然不行。但是对于大部分编译器来说,可以将析构函数申明为纯虚函数,然后在类外写纯虚函数的实现体,从语法上不会报错。
9、举例一种STL中的容器
答:比如vector(当时答得是这个),vector的的实现其实就是封装了一个动态数组,里面有3个内部迭代器,分别是start、finnish、end_of_storage。如果通过push_back或者insert插入元素造成超过容量,此时容量会扩展至2倍,这个过程分为:重新配置、移动拷贝元素、释放原空间,这3个大部,支持随机访问等
10、举例STL的一种算法
答:比如find、accumulate、next_permutation、unique、position等等
11、如何防止c++头文件被重复引用
答:可以使用ifndef或者program once,都可以。但是两者有一些区别。从兼容性上说,ifndfe更好,有些老的编译器可能不支持program once;此外,对于2个名字不同的头文件,但内容相同,ifndef还是可以鉴别出来,防止重复,program once 不行。
12、内联函数和宏的区别
答:内联函数的展开发生在编译期,而宏是在预处理阶段;内联函数本身是函数,而宏不是;最重要的一点:内联函数会对参数进行类型检查,而宏只是简单的替换,所以内联函数更加安全,所以往往宏需要对参数加括号,但是也不一定安全, 内联函数有自己明确的作用域或者访问权限,比如放在类里面的private,而宏是没有的。
13、linux下常用命令
答:(1)ls -al 显示当前目录下的所有文件目录信息,包括隐藏的
(2)mkdir 创建文件夹
(3)cat 查看文件内容
(4)cp 拷贝
(5)rm -rf 删除文件(夹)下所有文件
(6)find 查找文件
(7)grep 正则匹配
(8)pwd 显示当前文件路径
(9)ln 创建文件连接 -s 软连接
(10)chmod 修改文件权限
(11)netstat -a |grep 查看网络状态
(12)top
14、linux下进程管理的相关命令
(1)ps -e 查看所有的进程信息
(2)kill -9 pid 强行杀死进程
(3)top -p pid 查看进程信息
15、linux下如何查看内存、磁盘情况
(1)top
(2)df
(3)free
16、什么叫软连接和硬链接,他们的区别是什么
硬链接是以文件副本引用的形式存在的,他跟源文件拥有同一个inode节点;软连接是以路径的形式存在的,他的inode节点所对应的数据块存储的是源文件的路径。他们的区别的是:软连接可以跨文件系统创建,而且可以对目录进行创建,硬链接都不行,所以,相对来说,软连接更加灵活,删除软连接不会产生任何影响,但是如果源文件被删除了,那么所有的软连接就失效了,所以很像windows下的快捷方式。
17、什么叫相对路径什么叫绝对路径?
答:以/开头的就是绝对路径,因为他代表了从根目录出发的路径,反之就是相对路径
18、进程间通信的方式?
答:无名管道、有名管道FIFO,消息队列、共享内存、信号量、socket等,(应该进行简略阐述
19、c++下如何调用C的包?
答:extern “C”,通知编译器其所包含的代码用c的方式进行编译,这样连接的时候不会报错,否则会找不到函数符号。
20、找出去重后的数字的命令
$ sort test.txt | uniq
21、socket编程tcp客户端连接过程
建立套接字对象,connect、read/wirte
22\socket编程tcp服务器端连接过程
建立套接字对象、bind、listen、 accept、read/wirte
23、epoll和select的区别?
答:select能支持的文件描述符数是有限的,最大1024个,并且每次调用前都需要将其监听的读集、写集、错误集从用户态向内核态拷贝,返回后又拷贝回去,而且,select返回的时候是将所有的文件描述符返回,也就意味着一旦有个事件触发,只能通过遍历的方式才能找到具体是哪一个事件,效率比较低、开销也比较大,但是也有好处,就是他的超时的单位是微秒级别;
epoll能支持的文件描述符数很大,可以上万,他的高效由3个部分组成:红黑树、双向链表、回调函数,每次将监听事件拷贝到内核后就存放在红黑树种,以EventPoll的结构体存在,如果有相应的事件发生,对应的回调函数就会触发,进而就会将该事件拷贝至双向链表中返回,而且,epoll每次返回的都是有事件发生的事件,不是所有时间,所以比较高效,总的来说epoll适用于连接数较多,活跃数较少的场景、而select适用于连接数不多,但大多都活跃的场景。
24、同一个IP同一个端口可以同时建立tcp和udp的连接吗
答可以,同一个端口虽然udp和tcp的端口数字是一样的,但实质他们是不同的端口,所以是没有影响的,从底层实质分析,对于每一个连接内核维护了一个五元组,包含了源ip,目的ip、源端口目的端口、以及传输协议,在这里尽管前4项都一样,但是传输协议是不一样的,所以内核会认为是2个不同的连接,在ip层就会进行开始分流,tcp的走tcp,udp走udp。
25、mysql的建表、删除表、更新表、查询表用什么命令
答:Create|Drop|Update|Select TABLE [表名]
26、mysql的索引有哪几种?
答:(1)普通索引 CREAT INDEX [index_name] ON table(column(length))
(2)唯一索引
(3)全文索引
(4)单列、多列索引
(5)组合索引
27、索引的优缺点,索引是不是越多越好?
答:主要就是可以有效的缩短数据的检索时间,建立索引的列可以保证行的唯一性,可以加快表与表的连接;但是创建索引、维护索引需要时间和空间成本,每条索引都要占据数据库的存储空间,此外,每次的增删改都需要对索引进行动态的维护,也会导致时间变长。
28、索引的适用场景
答:(1)数据量大的并且查询频率高的应当使用索引
(2)表与表连接时的联合查询,约束条件的字段应该建立索引
(3)用于排序的字段可以使用索引
。。。。。
29、索引的原理
答:以空间换时间,建立索引之后,会将索引的KEY值放在一个BTree上,这个方式是一种n分法,btree适合在磁盘上动态查找表,每次以索引进行查找的时候,会根据key值进行搜索,logn级别的。
腾讯天美工作室(实习)
1、hash表使用开链,里面的链表过长说明了什么?
答:hash函数设计的不好,导致冲突严重,进而导致同一个“桶”内的链表数目增多。
2、c++不能被继承的类
答:(1)、可以将构造函数放入到private里面,这样是无法构造出子类对象的,同时增加一个static的 get instance的函数,来调用构造函数。(但是这样得不到一个栈上的对象)
(2)、让该类去虚继承一个模板类,传人的模板类型就是该类,使得该类成为模板类的友元,这样子类在构造时,他直接先构造祖先类的成分,显然他不是友元,所以失败。
(3)、使用c++11新增的final关键字,使得申明的类是一个最终类,无法被继承。
3、什么叫字长?
答:计算机在同一个时间能处理的一组二进制数称为计算机的一个字,这组二进制数的位数就是字长,所以现在计算机有16位、32位、64位等。
4、计算机的存储系统?
答:分为内存和外存,其中内存有主存、cache、寄存器等,外存分为磁盘、光盘等
5、static关键字的作用,存放位置
答:static关键字有隔离隐藏作用,比如多个cpp文件,如果将全局变量声明为static,那么该变量只对该文件可见;变量声明为static,可以使得这个值的生命期是整个程序结束;此外,c++类中的staitic 申明的变量和函数表示都是属于类的属性,而不是对象的成员。未初始化的放在bss段,初始化的放在data段中。
6、堆和栈的区别
答:
从管理方式上,
栈是由编译器自动管理,无需我们手动控制;
对于堆,开辟和释放工作由程序员控制,所以有内存泄漏等情况的发生。
从申请大小上,
栈是有高地址向低地址扩展的,是一块连续的内存区域,所以栈的栈顶地址或者大小 是一开始就分配好的。在使用过程中,比如递归调用层数过多,那么就有可能造成栈溢出,所以栈能获得的空间比较少;
堆是向高地址扩展的,是链表组织的方式,所以有可能是不连续的,他的大小只受限于有效的虚拟内存大小,所以堆能开辟的空间较大。
从碎片问题上,
栈是没有碎片的情况,因为他有严格的出栈入栈,不会存在一个内存块从栈的中间位置弹出;
堆有碎片的情况,频繁的调用new/delete分配释放内存,必然会造成内存碎片。
从分配方式上,
堆都是动态分配的
栈大多是静态分配的,也可以动态分配,可以由alloc函数分配。
从分配效率上,
计算机会在底层对栈提供支持,比如有专门的寄存器分配,用来存放栈的地址,压栈出栈的指令等;
堆是由c/c++函数库提供的,机制比较复杂(未了解)
7、struct和class的区别
答:这个在OMG面试中也出现过。
8、malloc和new的区别
答:最大的区别在于malloc只是简单的分配了内存空间,而new在分配了内存空间之后调用了对象的构造函数。详细的见:new和malloc的区别,或者delete和free.note
9、引用和指针的区别
答:引用是一个已有对象的别称,指针是一个地址,从非空性上说,引用不能为空,指针本身是个值,可以为空;在编码的时候,对引用我们不需要判断,但是对于指针,我们必须对其非空性进行判断;当指向的对象可能在发生变化的时候,往往使用指针,而引用一定固定的。
10、map的底层实现
答底层是红黑树实现的,它是一个比较平衡的搜索二叉树,内部有序,所以在查找和删除的时候比较高效,时间复杂度是logn
11、tcp的三次握手过程和四次挥手过程
答:这个建议将函数调用的情况添加进去说明。详细:TCP建立连接三次握手和释放连接四次握手.note
12、c++多态的实现原理
答:c++多态主要是通过虚函数表实现的,c++多态的体现,主要是通过父类指针指向一个子类对象,此时调用的函数就是子类的函数,体现了多态性,因为在调用过程中,通过钱4个字节的虚表指针找到了虚函数表,此时由于实际对象是子类对象,那么其虚函数表是子类的虚函数表,对于同一个虚函数,子类的虚函数将会覆盖掉父类的虚函数,构建出自己的虚函数表,所以此时通过虚表指针访问放的虚函数就是子类的虚函数,这就是c++的多态的体现。
13、c++对象的内存模型
答:在内存中,前4个字节代表了其虚表指针,指向的是子类的虚函数表,接下来存放的是父类的对象的成员,再是子类成员部分。
14c++的内存模型
答:内存分为5个段,从低地址往高地址,一次是代码段、数据段、bss段、堆、栈。然后balabala。。。。
15、滑动窗口的作用
答:主要就是为了实现流量控制,控制了发送包的速率,每次发送方只能发送滑动窗口内部的数据包,才能保证接收方不会因为发送过快造成流量淹没,数据包的丢失。他的大小是 拥塞窗口和通告窗口 两者的最小值。
项目
1、如何实现断点续传,如何提高上传速
算法
1、计算表达式 (改成后缀表达式进行处理)
2、朋友圈问题,求总共有多少个朋友圈 (使用并查集)
3、链表逆序 (剑指offer上有,但是如果不改变内存结构,那就只能改变值,使用栈进行存储)
4、一个数组找中位数(通过快排思想,常数级的若干次求position,直到恰好是中心,时间复杂度是O(n),如果是海量数据呢2g数据,500内存如何处理?->hash之后分成小文件,再外部排序,使用归并,可以使用最大堆,直到数据过半)
腾讯SNG(实习一面)
只持续了20分钟,似乎面试官很忙。
1、系统调用和库函数有什么区别和联系
2、epoll和select的区别
3、epoll的高效,有几种工作模式( LT、ET)
4、TCP 和 UDP的区别
5、TIMEWAIT是什么,为什么要设置TIMEWAIT状态
6、TCP的可靠性是如何实现的?(流量控制、拥塞控制、确认序号、校验???)
暂时记不起来了。
oppo(一面)
首先介绍项目,我给他介绍了一下这个项目的架构,功能。
问题1:你觉得这个项目的难点在于哪里?(懵逼了)
答:难点到不太多,可以说一下学到了什么,优化了什么,比如数据传输协议用到了protobuf,更快,更安全、数据量更小。
问题2:io复用和异步io有什么区别?
答:IO复用其实一种同步IO,他只是将事件通知统一交给了select或者epoll,所以,对于IO复用,其实Select或者epoll在检测可用时是阻塞的,里面的读写一般也是阻塞的,而异步IO是不会阻塞的,数据从内核态拷贝到用户态缓冲区完成后,***作系统会发送信号,通知进程处理,这个过程进程是可以继续执行的,这个就是异步io。
问题3:多进程和多线程有什么区别?如果给你一个业务场景,你是如何选择多进程还是多线程?
答:多线程共享同一个地址空间,带来的好处就是他们进行通信比较方便,可以通过全局变量等,但是也有隐患,需要处理好竞争问题,而且一旦一个线程崩掉了,整个进程就死了,影响其他进程。多进程相反。。此外,线程的创建开销更小。多进程的场景举例:比如你要进行主机迁移,多进程的话,你可以将某个进程迁移到另外的主机,不受影响,但是多线程没法迁移。
问题4:讲一讲c++的虚函数表呢?
答:c++的多态就是通过虚函数表来实现的,该表是在编译期生成,存放在rodata段,我们知道一个类的对象的内存结构是前4个字节是其虚表指针,即vptr,指向了其虚表,虚表中装的就是该类的虚函数。c++多态的体现,往往是通过父类指针,指向子类对象,我们发现调用的虚函数是子类的虚函数,而不是父类的就是因为此时的对象是子类对象,其虚表是子类的虚表,其中的同名虚函数早在编译期就已经被覆盖成子类的虚函数了,所以此时调用的是子类的虚函数,多态就是这么体现的。
问题5:构造函数、析构函数的顺序,为什么析构函数是反向的?
答:构造:先父类再子类; 析构:先子类再父类。 这是c++的规则。
中间 做了一套笔试题,各种各样的都有。
编程/算法
1、一个文件无序存放了1w个数字,每行1个。数字范围1-1w,现在随机删除2个数字。请把他们2个找出来。
答:使用hash数组,遍历文件,每遍历到一个数字,就以该数字为下标的数组元素置1,不用加1,因为数字不重复的。最后再遍历一遍数组,值为0的元素的下标就是所求数字。
2、如何对你申请的内存进行优化?
答:可以使用bitmap,每一bit可以代表一个数字,这样可以压缩内存。
3、压缩率是多少?
答:每个bit一个数字,而之前数组一个元素是int类型的,占32位,所以压缩率是32倍。
4、什么场景用bitmap?
答:我说数据较为密集,而且你这里数据是连续不重复,就符合,而且你的数据是有范围的。
5、如果数据有重复呢?
答:可以使用2-bitmap,00代表不出现,01代表出现1次,10代表出现2次,11表示无定义,这样遍历一遍就可以找到是哪几个数字
他回答:不是,比如数字3,具体有多少出现,这个这需要知道的。 我说:10bit可以表示的数是1024,而你每个数字不可能超过1w次。所以要记录次数的话,就还是用bitmap但是不是1位,大概1个数用14bit吧,但相比32位一个数要好些。
oppo二面
2、介绍usb的项目、功能、架构
3、这个io复用模型跟普通多线程、多进程的区别
答: io复用,多个链接复用一个线程,而普通多线程是一个链接一个线程,所以必然创建线程的数目就多,现成的创建是有开销的,所以io复用这种开销小。
4、网络传输的数据协议
主要有3个段,前8bit是数据type,中间是length,最后是具体的data。
5、如果协议是这样。如果两个数据包连在一起,怎么分开?
答:在首部再加几个bit,作为隔离位。
6、如何实现你的fd是负载均衡的
答:分类处理
7、多个用户访问同一个资源,如何加锁
答:不太明白他的意思,epoll内部处理事件是同步依次执行的,而且这里的锁是线程资源
8、tcp是如何处理粘包?
9、tcp是如何关闭的?就是说4次挥手过程
10、如果tcp关闭的第四个分节没有被收到,那么怎么办?
11、tcp的拥塞控制过程
12、delete和free的区别
13、STL的出现是为了什么
14、STL的迭代器的类型有哪几种?
15、STL hashmap的实现?
16、线程间同步的手段
17、进程间通信的方式
18、如何使用信号量制作出一个互斥锁
19、系统调用的返回有什么变化?
20、描述一下系统中断的过程
21、c++多态是如何实现的?
22、c++多继承是如何实现?如何处理同名变量
23、怎么实现无锁***作
24、你评价一下你自己。
25、你觉得你同学朋友如何评价你?
26、你对哪些技术感兴趣?
27、参加过哪些社团
28、你怎么协调与他人的关系的?
29、你有什么要问我的吗?
百度云一面
1、C++多态的实现
2、多重继承下,多个父类含有同一同名函数,子类对象调用会有问题吗?
答:首先 AB2个父类中的函数假设就是普通成员函数f(),那么子类C没有自己的f函数,其对象c.f()的时候就会报错,编译报错,存在二义性。如果C有自己的f函数,此时不会报错,调用的是自己c类的f()函数,也就是说此时父类的函数就被隐藏了。如果AB中的f()是虚函数,那么也不受影响,还是调c的。如果2个f的参数类型也不一样,也会报二义性错误。(为什么呢?)
3、static变量
4、tcp三次握手 、2次、4次?
5、tcp可靠性的实现原因
6、滑动窗口的作用
7、原子***作如何实现(锁、cas***作)
8、如何实现一个互斥锁,互斥锁的实现原理
想不起来了
笔试:
特殊链表(每个节点带一个随机指针),对该链表进行复制,输出复制后的新链表。(剑指offer原题)
百度云二面
1、socket和epoll的关系区别?(不太懂他意思,反正对epoll的底层进行了阐述)
2、红黑树是线程安全的吗
3、有哪些同步手段
4、用过哪种锁(mutex)
5、读写锁了解过吗,自己实现一下,提出思路即可(对读***作进行计数)
6、计数如何保证线程安全?(cas***作、***作系统底层指令支持)
7、vector的插入pushback的时间复杂度是多少(O(n))
8、如果vectorpushback的时候扩容了,比如pushback n个数,时间复杂度是多少?(我给他阐述了内存拷贝的过程,但是不知道怎么求,他回答说:其实是一个等差数列,最后求得还是O(n))
9、vector底层是几个指针实现的(3个 start、finish、end_of_storage)
10、vector扩容几倍 (SGI STL的vector是2倍)
11、c++多态的实现(run time的多态:指针或者引用 结合 虚函数表实现)
12、c++11 move语意解释一下
13、 move除了用于指针,还可以用于哪些?比如哪些数据结构 (vector)
14、拿过哪些offer
想不起来了。。。
360二面
1、使用stl如何保证线程安全(除了锁以外)
2、交给sub 线程的文件描述符如何回收的?
3、tcp粘包
4、linux下查看网络连接
5、linux下查看内存cpu (top)
6、linux下查看内核版本 uname-a
7、linux下查看发行版本 cat /etc/issue
8、IO和reactor模式 (吹的select和epoll)
9、linux下 进程cpu占用是怎么计算的(大致是:通过/proc/stat 读取CPU总的时间,再通过/proc/pid/stat下读取进程的占用时间,做除法。(比较粗略的阐述))
10、linux下 tmp目录里面的内容会被清除吗(会,系统会执行tmpwatch脚本,一般传入参数是时间,比如 tmpwatch 10 /tmp/ 表示的就是会删除10天内没有修改、访问的文件。)
11、怎么查动态依赖的库有哪些?(readelf -a [程序名] |grep library)
腾讯IEG魔方工作室(简历面)
tcp udp 游戏
容器线程安全
hashmap实现
新链接 何时注册写事件
主线程如何将fd交给sub线程?
为什么这个回调函数在本函数执行,是线程安全的?
rehash
多线程,多进程区别
切换的性能损耗
strncpy
。。。
总算写完了。。给腾讯攒人品!求不搞事啊。(-。-)