朋友的鹅厂面试经验(offer到手)

2020年也是我人生中低谷的一年,写下这篇博客一是分享,希望能给广大IT界朋友带来一些帮助,二是对自己的总结。这次面试之前我已有去腾讯面试过3次的经历,均已失败告终,但这次我抓住了机会最终拿到了offer,所以首先我想说的是不要害怕失败,特别是我们作为一个年轻人,更加不要害怕失败,因为对于我们年轻人来说,失败的代价是比较小的,除了不要害怕失败之外,更重要的是要敢于面对的失败,认识到自己的不足,默默去耕耘,去改正它,坚持不一定能成功,但不坚持一定难以成功!不得不说,腾讯是一家很重视人才的公司,只要你是一个善良、正直、进取有能力的人,腾讯都是很欢迎的,学校学历也不是绝对的,当然你有好学校高学历,你比别人的起步也会更高。

       因为我面的是技术岗,所以我这里分享的也是技术岗体会,毕竟对其它岗位也不是很了解。腾讯的面试一般是五轮面试,一二三轮都是技术面试,四轮是GM面试,五轮是HR面试,有些重要的岗位可能会有六轮,可能我面试的这个岗位比较紧急,我只进行了四轮面试,减掉了一轮技术面,但即使是四轮面试,前前后后也花了我一个月的时间,所以去腾讯面试要做好长时间面试的准备,总之就是从各方面考察你的能力,包括不限于技术能力、项目能力和综合能力,也不得不说,腾讯对求职者的要求很高。但不管如何,都得保持必要的自信心。

       第一轮,面试官一般是考察求职者的基础能力,对技术基础的掌握程度,由浅入深,会考察的很细,例如我面试的是后台开发工程师,基础能力会考察你语言基础,数据库、数据结构和算法、网络协议原理等等。

       第二轮,面试官一般是组长,一般会考察你解决问题的思维能力和拓展能力,你的知识面,会出一些实际的问题让你说出解决办法,同时也可能会考察你的项目能力,说说你做的项目有什么难点,学到了什么等等,这个取决于你对你做的项目了解程度。

       第三轮,面试官一般是技术总监,一般会考察你的项目能力和综合能力,综合能力是指,例如你的学习能力,抗压能力,沟通能力等等。

       第四轮,面试官是GM(部门总经理),一般是考察你的稳定性,会问你的意愿,你的职业规划等等,同时GM也可能会问道项目技术上的问题。

       第五轮,面试官就是腾讯的HR了,到这一轮一般就是问你在职时间、离职原因和期望薪资等等,所以要诚实回答,诚实也对每一轮都很重要。

       上面的总结也是根据我的经历,不同的岗位不同的面试官也有不同的面试方法,有的面试官可能会直接让你写代码,总之,经过几轮下来的面试对会你各个方面的能力进行考察,如果你通过了所有面试,就会拿到offer。但是,最后还有一步就是对你进行背景调查,所以诚实很重要。

下面是一些基础题总结:
       下面只是一些简单的总结,没有解释的很清楚,如有错误请批评指正!

C/C++常考:
1、static关键字的作用

       修饰函数的局部变量,改变其变量的生命周期;修饰全局变量,改变其变量的可见性,只在本文件内可见;修饰类成员变量,会使其类成员变量成为类的全局变量,会被类的所有对象共享,不属于某个对象,则在类外初始化;修饰类成员函数,修饰后该函数不含有this指针,所以不能访问非静态成员,可以访问静态成员。

2、const关键字的作用

       修饰变量后该变量就不能被修改;修饰成员函数后该函数不可以修改任何数据成员;const与指针,const放在*号前和*号后分别表示指针常量和常量指针,前者表示指向的内容不能改变,后者表示指向不能改变。

3、const和#define的区别

       #define是在预处理阶段起作用,const是在编译、运行时起作用;#define只是简单的字符串替换,没有类型检查,而const有对应的数据类型,有类型检查;#define有多少地方使用,就有多少次替换,const只有一份备份;有些集成化工具可以对const调试。

4、内存分区

       静态存储区域:编译的时候就分配好了,存放全局变量、static变量;

       栈:存放函数内的局部变量;

       堆:动态内存分配区域。

5、malloc/free和new/delete的区别

        malloc/free是C的库函数,而new/delete是C++的运算符;malloc/free只是开辟释放空间,new/delete不仅是开辟释放空间,同时还会调用构造函数和析构函数进行初始化和清理;malloc返回类型为void*,而new则直接返回对应类型的指针。

6、sizeof用法注意

        sizeof计算字符串时会将'\0'计算在内,而strlen是不包括'\0'的;计算数组大小时会根据数据定义的长度和数组类型进行计算,若字符数组没有定义长度会计算出实际大小;若定义一个指针指向一个字符串,则计算的是指针类型大小;若函数形参是数组形式,函数内部用sizeof计算时,这时形参自动转换为指针,则计算出的是指针类型大小。

7、用int、bool和float定义的变量flag与零进行比较

        if(flag_int == 0)

        if(!flag_bool)

        const float EXPSINON = 0.00001

        if(flag_float >= -EXPSINON && flag_float <= EXPSINON)

        因为浮点数都有精度,它不能与任何数直接比较,所以先设一个比较的精度值。

8、inline、explicit、volatile关键字的作用

        inline:在C/C++中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题;

        explicit:防止类构造函数隐式自动转换;

        volatile:是一种类型修饰符,编译器对访问该变量的代码就不再进行优化,从而可以被编译器未知的因素更改,可以提供对特殊地址的访问。

9、解释重载、隐藏、覆盖(重写)

        重载:同一作用域,函数名相同,参数个数或类型不同,返回类型不限制;

        隐藏:不同作用域,派生类的函数(不带virtual)屏蔽了与其同名的基类函数,参数和返回值不限制;

        覆盖(重写):不同作用域(父子类),函数名、参数和返回类型都完全一样,且基类方法必须带virtual关键字。

10、引用和指针的区别

        引用只是变量的别名,操作引用就是操作变量本身;声明和使用引用时必须初始化,一旦初始化不可更改,而指针可以不初始化;引用没有数据类型,不占存储空间,而指针有数据类型,占存储空间;不能返回局部变量的引用,不能返回函数内部new分配的引用。

11、解释封装、继承、多态

         封装:就是类的抽象,将具体的事物对象进行抽象化,封装其属性和行为;

         继承:不同的事物对象有相同的属性和行为,但也有各自的不同,所以需要用到继承;

         多态:基类的指针指向不同的派生类其行为不同。

12、类的默认函数

         默认构造函数;

         默认拷贝构造函数;

         默认析构函数;

         默认重载赋值运算符函数;

         默认重载取址运算符函数;

         默认重载取址运算符const函数;

         默认移动构造函数;(C++11)

         默认重载移动操作符函数。(C++11)

13、基类为什么需要虚析构函数

         可能会调用不到派生类的析构函数,造成内存泄露。当一个基类的指针指向一个派生类对象,释放这个指针时,如果基类没有用虚析构,就无法调用到派生类的析构函数。

14、菱形继承有什么问题

         派生类中基类数据会有多次拷贝。

15、STL常用有哪些

          vector(容器)、map(映射)、queue(队列)、set(集合)

其中map和set底层实现都是红黑树,只不过set只存储同类型的一个值而不存储键值对,并且这些数据都是唯一的。

16、数组指针和指针数组的区别

(1)数组指针也称指向一维数组的指针,亦称行指针;

         定义int (*p)[n];  ()的优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长,也就是说执行p+1时,p要跨过n个整型数据的长度。

(2)指针数组是多个指针变量,以数组的形式存放在内存中;

         定义int *p[n]; [ ]优先级高,先与p结合成一个数组,再由int *说明这是一个整型指针数组,它有n个指针类型的数组元素。

所以这两者的区别就很明显了,指针数组只是一个指针变量,C语言里专门用来指向二维数组,它占有内存中的一个存储空间;指针数组是多个指针变量,以数组的形式存放在内存中,占有多个指针的存储空间。

 

数据结构与算法:
1、常见的数据结构

         数组、链表、队列、栈、堆、树、图、哈希表等。

2、二叉树

         每个节点最多只能有两个节点,二叉树是有序的,二叉树可以为空。

3、二叉查找树

         是一种特殊的树,其中每个节点的值都要大于其左子树中任意节点的值而小于右子树中任意节点的值。

4、平衡二叉树(AVL树)

         它要求对于每个节点,它的左右子树的高度只差不能超过1,如果插入或删除一个节点高度只差大于1,就要进行节点之间的旋转,并且它也是有序的。

5、红黑树

         简单来说它是特殊的自平衡二叉树,是AVL树的变种,它有几点规则: 

         每个结点只能是红色或者黑色;根结点和叶结点都是黑色的;如果结点是红色的,则它两个子结点都是黑色的,也就是说在一条路径上不能出现相邻的两个红色结点;从任一结点到其每个叶子的所有路径都包含相同数目的黑色结点。

6、B树

        根结点至少有两个子女;每个中间结点有k-1个元素和k个孩子;叶子结点都包含k-1个元素;叶子结点都位于同一层;结点当中k-1个元素正好是k个孩子包含的域值分划。

7、B+树

        所有的中间结点元素都同时存在于子结点,在子节点元素种是最大或最小元素;有k个子树的中间结点包含有k个元素每个元素不保存数据,只用来索引,所有数据都保存在叶子结点上;所有的叶子结点中包含了全部元素都信息,及指向含这些元素记录的指针,且叶子结点本身依关系字的大小自小而大顺序链接。

8、解决哈希冲突的方法

        线性探测法:其实就是向后寻找空位置;

        链地址法:像链表一样连在后面。

9、常用排序方法

         交换类排序:冒泡排序、快速排序;

         选择类排序:简单选择排序、堆排序;

         插入类排序:直接插入排序、希尔排序;

         归并排序。

 

MYSQL数据库常考点:
1、数据库基本知识

          主键=主码=主关键字

2、数据库三范式

          属性不可再分;

          消除部分依赖;

          消除传递依赖。   

3、事务是什么

          事务是并发控制的基本单位,所谓的事务,它是一个操作序列,由一条或多条sql语句组成。

4、事务的属性

          原子性:事物开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节,事物执行过程中出错,会回滚到事物开始前的状态,所有的操作就像没有发生一样,也就是说事物是一个不可分隔的整体,就像化学中学过的原子,是构成物质的基本单位;

          隔离性:同一时间,只允许一个事物请求同一数据,不同的事物之间彼此没有任何干扰,比如A正在从一张银行卡取钱,在A取钱的过程结束前,B不能向这张银行卡转账;

          一致性:事物开始前和结束后,数据库的完整性约束没有被破坏,比如A向B转账,不可能A扣了钱,B没有收到;

          持久性:事物完成后,事物对数据库的所有更新将被保存在数据库中,不能回滚。

5、事务的并发问题

          脏读:事物A读取了事物B更新的数据,然后B回滚操作,那么事物A读到的是脏数据;

          不可重复读:事物A多次读取同一数据,事物A在事物B读取的过程中,对数据做了更新并提交,导致事物A多次读取同一数据时,结果不一致;

          幻读:事物A更改了表中所有数据,但事物B又在表中插入一条数据,事物A就发现还有一条数据没有更改过来,就好像发生了幻觉一样,这就叫幻读。

小结:不可重复读和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表。

6、事物的隔离级别

          read-uncommitted(读未提交);

          read-committed(读已提交),解决脏读;

          repeatable-read(可重复读),解决脏读、不可重复读;

          serializable(串行化),解决脏读,不可重复读,幻读。      

7、mysql常用数据库引擎

          mysql常用引擎有两种:Innodb和MyISAM。

8、Innodb引擎的底层原理

           底层原理是用B+树实现的。

9、Innodb和MyISAM的优缺点

            Innodb引擎提供了对数据库ACID事物的支持,并且实现了SQL标准的四种隔离级别;该引擎还提供了行级锁和外键约束,它的设计目标是处理大容量数据库系统;但是该引擎不支持FULLTEXT类型的索引,而且它没有保存表的行数,当SELECT COUNT(*) FROM TABLE时需要扫描全表;当需要使用数据库事物时,该引擎当然是首选;由于锁的颗粒度更小,写操作不会锁全表,所以在并发较高时,使用Innodb引擎会提升效率。

            MyISAM时MySQL的默认引擎,它没有提供对数据库事物的支持,也不支持行级锁和外键,因此当INSERT或UPDATE数据时既写操作需要锁定整个表,效率会低一些;不过和Innodb不同,MyISAM存储了表的行数,于是SELECT COUNT(*) FROM TABLE时只需要直接读取已经保存好的值而不需要进行全表扫描;如果表的读操作远多于写操作且不需要支持事物,MyISAM是很好的选择。

 

网络原理:
1、OSI七层模型

             物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。

2、TCP/IP四层模型

             数据链路层、网络层、传输层、应用层。

3、TCP三次握手和四次挥手

             三次握手是通过SYN标志位发起连接、四次挥手是通过FIN标志位发起断开连接、ACK标志位都用来确认,还涉及到序列号和确认号,假如一方序列号是x,另一方确认返回的确认号一定是x+1。

4、TCP三次握手的原因

             第三次握手的目的是为了防止已经失效的连接请求突然又传送到了服务端,因为网络中又可能存在延迟的问题,如果采用二次握手就会让服务端误认为客户端是再次发出新的连接请求,让后服务端一直等待请求发来数据,这样就浪费了很多资源。

5、TIME_WAIT状态有什么作用

             time_wait状态的产生是,假如由客户端主动断开连接,服务端确认,服务端发送完所有的数据后,服务端再发送断开连接,客户端收到确认就会进入time_wait状态,这个时候客户端不能直接进入close状态,因为这个确认可能会在网络中丢失服务端没有收到,为了可靠的实现TCP全双工连接的终止,所以需要time_wait状态,这个状态一般等待时间是2MSL秒,MSL(最大分节生命期)时间由系统决定。

 

系统:
1、Linux使用的进程间通讯

              管道;信号;信号量;共享内存;消息队列;套接字。

2、多线程同步

              Win:信号量、临界区、内核对象、互斥量;

              Linux:信号量、条件变量、互斥锁。

3、main函数执行前会执行什么

              设置栈指针;初始化static变量和全局变量;运行全局构造器,进行C++中的函数构造;传递main函数参数。

4、makefile符号知识

               $@:指的是目标文件;

               $^:指所有的依赖文件;

               $<:指的是第一个依赖文件;

               $?:构造所需文件列表中更新过的文件;

               $:主要扩展打开makefile中定义的变量;

               $$:主要扩展打开makefile中定义的shell变量。

5、$*与$@有什么区别

               $*:以一个字符串形式输出所有传递到脚本的参数

               $@:以$IFS为分隔符列出所有传递到脚本的参数

 

      知识点还有很多很多,我这里也只总结了一点点,并且还没有深入讲解,要完全掌握一项知识技能,都得花时间去研究,后面有时间我也会继续分享一些自己写的原创文章,致敬为梦想奋斗的人!
 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值