搞定技术面试-会了这些高频问题,你就稳了
高频问题
C++
- 语言基础,C++中的定义,指针,模板,多态,重载等(尤其是多态,给定一个程序,基类子类有不同实现,考虑输出结果,这一类的题目面试题也极为高频)
- 指针和引用的区别
- 堆和栈的区别
- new和delete是如何实现的,new 与 malloc的异同处
- C和C++的区别
- C++、Java的联系与区别,包括语言特性、垃圾回收、应用场景等java的垃圾回收机制)
- Struct和class的区别
- define 和const的区别(编译阶段、安全性、内存占用等)
- 在C++中const和static的用法(定义,用途)
- const和static在类中使用的注意事项(定义、初始化和使用)
- C++中的const类成员函数(用法和意义)
- 计算下面几个类的大小:
class A {};: sizeof(A) = 1;
class A { virtual Fun(){} };: sizeof(A) = 4(32位机器)/8(64位机器);
class A { static int a; };: sizeof(A) = 1;
class A { int a; };: sizeof(A) = 4;
class A { static int a; int b; };: sizeof(A) = 4;
- 给一个代码,求输出结果
class A
{
public:
A(int x){}
}
问:A a = 1;是否正确, 如果正确, 那么它调用了哪些函数?
这类题目更常见的是在基类和子类有不同实现方法。(虚函数相关,栗子很多,不多说了)
- C++的STL介绍(这个系列也很重要,建议侯捷老师的这方面的书籍与视频),其中包括内存管理allocator,函数,实现机理,多线程实现等
- STL源码中的hash表的实现
- STL中unordered_map和map的区别
- STL中vector的实现
- vector使用的注意点及其原因,频繁对vector调用push_back()对性能的影响和原因。
- C++中的重载和重写的区别:
- C ++内存管理(热门问题)
- 介绍面向对象的三大特性,并且举例说明每一个。
- 多态的实现(和下个问题一起回答)
- C++虚函数相关(虚函数表,虚函数指针),虚函数的实现原理(热门,重要)
- 实现编译器处理虚函数表应该如何处理
- 析构函数一般写成虚函数的原因
- 构造函数为什么一般不定义为虚函数
- 构造函数或者析构函数中调用虚函数会怎样
- 纯虚函数
- 静态绑定和动态绑定的介绍
- 引用是否能实现动态绑定,为什么引用可以实现
- 深拷贝和浅拷贝的区别(举例说明深拷贝的安全性)
- 对象复用的了解,零拷贝的了解
- 介绍C++所有的构造函数
- 什么情况下会调用拷贝构造函数(三种情况)
- 结构体内存对齐方式和为什么要进行内存对齐?
- 内存泄露的定义,如何检测与避免?
- 手写实现智能指针类(34-37我没遇见过)
- 调试程序的方法
- 遇到coredump要怎么调试
- 内存检查工具的了解
- 模板的用法与适用场景
- 成员初始化列表的概念,为什么用成员初始化列表会快一些(性能优势)?
- 用过C11吗,知道C11新特性吗?(有面试官建议熟悉C11)
- C++的调用惯例(简单一点C++函数调用的压栈过程)
- C++的四种强制转换
操作系统
- 进程通信方式(linux/windows,每种方式的特点),线程通信(linux/windows),进程与线程区别,页面置换策略(考察置换几次),进/线程状态转换图,进程调度方式,死锁(必要条件,哲学家就餐,银行家,读者写者问题)
- 进程与线程的区别和联系
- 一个进程可以创建多少线程,和什么有关
- 一个程序从开始运行到结束的完整过程(四个过程)
- 进程通信方法(Linux和windows下),线程通信方法(Linux和windows下)
- 进程调度方法详细介绍
- 页面置换方法详细介绍
- 能否实现一个LRU算法
- 死锁的必要条件(怎么检测死锁,解决死锁问题)
- 哲学家就餐,银行家,读者写者,生产者消费者(怎么加锁解锁,伪代码)
- 海量数据的bitmap使用原理
- 布隆过滤器原理与优点
- 布隆过滤器处理大规模问题时的持久化,包括内存大小受限、磁盘换入换出问题
- 同步IO和异步IO
- 文件读写使用的系统调用
- 线程池的了解、优点、调度处理方式和保护任务队列的方式
- 怎么回收线程
- 僵尸进程问题
- 多线程同步(尤其是如果项目中用到了多线程,很大可能会结合讨论)
- mem***了解
- 异常和中断的区别
- 一般情况下在Linux/windows平台下栈空间的大小
Linux
- IO模型,linux常见命令(grep,awk,sed),文件系统
- Linux的I/O模型介绍以及同步异步阻塞非阻塞的区别(超级重要)
- 文件系统的理解(EXT4,XFS,BTRFS)
- 文件处理grep,awk,sed这三个命令必知必会
- IO复用的三种方法(select,poll,epoll)深入理解,包括三者区别,内部原理实现?
- Epoll的ET模式和LT模式(ET的非阻塞)
- 查询进程占用CPU的命令(注意要了解到used,buf,***代表意义)
- linux的其他常见命令(kill,find,cp等等)
- shell脚本用法
- 硬连接和软连接的区别
- 文件权限怎么看(rwx)
- 文件的三种时间(mtime, atime,ctime),分别在什么时候会改变
- Linux监控网络带宽的命令,查看特定进程的占用网络资源情况命令
计算机网络
- TCP/IP协议及其编程:计算机网络基础,socket编程,其中子网划分,七层协议(例如交换机属于数据链路层一类题目),五层协议,协议名称及其作用,常用端口号,https1.0 1.1特性与区别,三次握手四次挥手(可能出现的服务器攻击),加密(对称,非对称),IO复用等
- 建立TCP服务器的各个系统调用
- 继上一题,说明socket网络编程有哪些系统调用?其中close是一次就能直接关闭的吗,半关闭状态是怎么产生的?
- 对路由协议的了解与介绍。内部网关协议IGP包括RIP,OSPF,和外部网关协议EGP和BGP.
- 路由协议所使用的算法。
- TCP和UDP的区别
- TCP和UDP相关的协议与端口号
- TCP(UDP,IP)等首部的认识(http请求报文构成)
- 网页解析的过程与实现方法
- 在浏览器中输入URL后执行的全部过程(如www.baidu.com)
- 网络层分片的原因与具体实现
- TCP的三次握手与四次挥手的详细介绍(TCP连接建立与断开是热门问题)
- TCP握手以及每一次握手客户端和服务器端处于哪个状态(11种状态)
- 为什么使用三次握手,两次握手可不可以?
- IME_WAIT的意义(为什么要等于2MSL)
- 超时重传机制(不太高频)
- TCP怎么保证可靠性(面向字节流,超时重传,应答机制,滑动窗口,拥塞控制,校验等)?
- 流量控制的介绍,采用滑动窗口会有什么问题(死锁可能,糊涂窗口综合征)?
- tcp滑动窗口协议
- 拥塞控制和流量控制的区别
- TCP拥塞控制,算法名字?(极其重要)
- http协议与TCP联系
- http/1.0和http/1.1的区别
- http的请求方法有哪些?get和post的区别。
- http的状态码
- http和https的区别,由http升级为https需要做哪些操作
- https的具体实现,怎么确保安全性
- http中浏览器一个URL的流程,这个过程中浏览器做了什么,URL包括哪三个部分?
- 一个机器能够使用的端口号上限是多少,为什么?可以改变吗?那如果想要用的端口超过这个限制怎么办?
- 对称密码和非对称密码体系
- 数字证书的了解(高频)
- 客户端为什么信任第三方证书
- RSA加密算法,MD5原理(MD5不算加密算法)
- 单条记录高并发访问的优化
- 介绍一下ping的过程,分别用到了哪些协议
- TCP/IP的分片粘包过程
- 有没有抓过TCP包,描述一下
- 一个ip配置多个域名,靠什么识别?
- 服务器攻击(DDos攻击)
数据库
- 索引作用,应该/不应该创建索引的列,索引底层实现,sql语法,常见引擎特点,事务特点,隔离级别(引擎默认级别),隔离级别的问题,锁等
- 关系型和非关系型数据库的区别(各自优点)
- 常用SQL语句(DDL,DML,DCL,TCL)
- 数据库中join的类型与区别(inner join, outer join, cross join, natural join, self join),注意适用场景和sql语句的编写
- 数据库的索引类型
- 聚集索引和非聚集索引的区别(叶节点存储内容)
- 唯一性索引和主码索引的区别
- 索引的优缺点,什么时候使用索引,什么时候不能使用索引(重点)
- 索引的底层实现(B+树,为何不采用红黑树,B树)
- B树和B+树具体实现
- 索引最左前缀问题
- Mysql的优化(高频,索引优化,性能优化)
- 数据库引擎介绍,innodb和myisam的特点与区别
- 数据库中事务的ACID(四大特性都要能够举例说明,理解透彻,比如原子性和一致性的关联,隔离性不好会出现的问题)
- 数据库隔离性设置不同会出现的问题(脏读、不可重复读、丢失修改、幻读)
- 数据库的隔离级别,mysql和Oracle的隔离级别分别是什么
- 数据库连接池的作用
- Mysql的表空间方式,各自特点
- 分布式事务
- 数据库的范式
- 数据的锁的种类,加锁的方式
- 视图的作用与使用方法(如何删除等)
- 分库分表,主从复制,读写分离。(我不会,也没碰到过)
- 项目中哪里用到了数据库,怎么用的
算法和数据结构
- 红黑树的了解(平衡树,二叉搜索树),使用场景
- 红黑树在STL上的应用
- 了解并查集吗?(低频)
- 贪心算法和动态规划的区别
- 判断一个链表是否有环,如何找到这个环的起点
- 实现一个strcpy函数(或者memcpy),如果内存可能重叠呢
- 实现一个循环队列
- 排序算法(写快排,归并排序,堆排序),算法的时间复杂度,空间复杂度,是否稳定等
- 快排存在的问题,如何优化
- 反转一个链表
- Top K问题(可以采取的方法有哪些,各自优点?)
- Bitmap的使用,存储和插入方法
- 二叉树的先序、中序、后序遍历(非递归实现)
- 二叉树的公共祖先(简单地说,剑指offer上的题大都是高频题)
- 1-n中有多少个1
- 字典树的理解以及在统计上的应用
- 数组的全排列
- N个骰子出现和为m的概率
- 海量数据问题(可参考左神的书)
- 一致性哈希
设计模式
- 介绍熟悉的设计模式
- 单例模式:懒汉式、饿汉式、线程安全版本
- MVC 设计模式
思考题
- 100层楼,只有2个鸡蛋,想要判断出那一层刚好让鸡蛋碎掉,给出策略(滴滴笔试中两个铁球跟这个是一类题)
- 毒药问题,n拼毒药,要快速找出哪一瓶有毒,需要几只小白鼠
- 博弈论问题
- 先手必胜策略问题:n本书,每次能够拿X-X本,怎么拿必胜
- 放n只蚂蚁在一条树枝上,蚂蚁与蚂蚁之间碰到就各自往反方向走,问总距离或者时间。
- 瓶子换饮料问题:多少个瓶子能够换1瓶饮料,问最多能喝几瓶
Reference
- 守望者1028