技术面试复习大纲!
技术面试考察的知识点非常多,很多小伙伴复习的时候一头雾水,不知道什么是重点。
于是,我就结合自己的个人经验来简单总结一份技术面试的核心知识点的复习指南。
希望能让大家准备面试或者回顾知识更加顺利!
这篇文章没有针对具体的编程语言来说,所以对于准备技术面试的小伙伴来说是通用的。
计算机基础
数据结构
相关阅读:八股文骚套路之数据结构
数据结构的种类非常多,不过最常用同时也是面试最常问的数据结构主要就是下面这些:
「线性数据结构」:
「数组」 :数组(Array) 是一种很常见的数据结构。它由相同类型的元素(element)组成,并且是使用一块连续的内存来存储。
「链表」 :链表(LinkedList) 虽然是一种线性表,但是并不会按线性的顺序存储数据,使用的不是连续的内存空间来存储数据。链表的插入和删除操作的复杂度为 O(1) ,只需要知道目标位置元素的上一个元素即可。但是,在查找一个节点或者访问特定位置的节点的时候复杂度为 O(n) 。
「栈」 :栈 (Stack)只允许在有序的线性数据集合的一端(称为栈顶 top)进行加入数据(push)和移除数据(pop)。因而按照 后进先出(LIFO, Last In First Out) 的原理运作。在栈中,push 和 pop 的操作都发生在栈顶。栈常用一维数组或链表来实现,用数组实现的栈叫作 顺序栈 ,用链表实现的栈叫作 链式栈 。
「队列」 :队列(Queue)是 先进先出( FIFO,First In, First Out) 的线性表。在具体应用中通常用链表或者数组来实现,用数组实现的队列叫作 顺序队列 ,用链表实现的队列叫作 链式队列 。队列只允许在后端(rear)进行插入操作也就是 入队 enqueue,在前端(front)进行删除操作也就是出队 dequeue。队列的操作方式和堆类似,唯一的区别在于队列只允许新数据在后端进行添加。
「图」 :图就是由顶点的有穷非空集合和顶点之间的边组成的集合。通常表示为:「G(V,E)」,其中,G 表示一个图,V 表示顶点的集合,E 表示边的集合。图可以被简单的分为:无向图和有向图,无权图和带权图。
「树」 : 树就是一种类似现实生活中的树的数据结构(倒置的树)。任何一颗非空树只有一个根节点。常见的树的种类有:平衡树、二叉搜索树、平衡二叉树、红黑树、B 树、LSM 树、字典树(Trie 树)
「堆」 :堆是一种满足特定条件的树:堆中的每一个节点值都大于等于(或小于等于)子树中所有节点的值。或者说,任意一个节点的值都大于等于(或小于等于)所有子节点的值。堆分为最大堆和最小堆。
「哈希表」 :也叫散列表,是根据关键码值(Key value)而直接进行访问的数据结构,通过 key 就能获取到指定的 value ,速度非常快。
「跳表」 :跳表(Skip List)是由 William Pugh 发明的一种查找数据结构,支持对数据的快速查找,插入和删除。跳表的查询,插入和删除操作的期望时间复杂度都为 O(log n)。
「常见问题总结」 :
「通用常识」:像数据结构的定义,查找、插入、删除元素的时间复杂度,应用场景是每一个数据结构都应该掌握的最基本的点。
「线性数据结构」 :
数组 vs 链表
栈 vs 队列
实现一个栈/队列
翻转链表、返回链表中倒数第 n 个节点、链表合并......
「图」 :
图的常见概念比如顶点的度
图的遍历算法(广度优先搜索和深度优先搜索)
拓扑排序
欧拉回路
迪杰斯特拉(Dijikstra)算法(最短路径问题)
「树」 :
二叉树的前序遍历、中序遍历、后序遍历
二叉查找树的出插入、查找、删除
二叉树的高度计算
红黑树 vs 二叉查找树
「堆」 :
堆中插入数据
如何删除堆顶元素
堆排序
「哈希表」 :
哈希冲突是什么?如何解决?
键值的映射关系如何维护?哈希函数如何设计?
「跳表」:
为什么 Redis 选择使用跳表而不是红黑树来实现有序集合?
跳表的查找、插入、删除元素的流程
跳表插入元素时,如何动态维护索引?
算法
相关阅读:八股文骚套路之算法
和框架应用类知识不同,算法仅仅通过一周甚至是一个月的突击是完全没办法快速上手的!
想要在算法面试中如鱼得水,就必须持之以恒地坚持刷题-> 总结->再刷题 -> 再总结。
你需要做的就是提前半年甚至是一年来刷 Leetcode,并总结一些常见题目类型的套路!
「那我们应该怎么更高效低刷题呢?」 给几点自己的刷题建议:
「按照类型来刷」 :一般情况下,一个类型的题目刷 5~10 道左右就够了!
「由简入难」 :刷算法是一个循序渐进的过程,如果你不是 ACM 大佬这种级别的人物的话,还是建议先从简单开始刷起,慢慢积累经验。不过,要说明的一点是:很多简单类型的题目甚至还要比中等类型的题目还要难!所以,如果你没办法解决一些简单的算法题,也不要太纠结,不要因此失去信心。
「重点关注面试高频题目/题型」 :如果你的时间不是很充足的话,建议可以从高频面试题入手。像 Leetcode 上面就专门把一些最热门的算法面试题给单独整理了出来。
「多思考」 :一定不要遇到不会的算法题就直接看别人的答案,这样会让自己形成依赖心理。一定要先思考,一定要多思考!
......
刷题之前,我建议你应该具有基本的算法基础。比如你应该搞清楚常见的算法思想(递归、动态规划、二分查找、贪心、分治、回溯、DFS、BFS、KMP、树的广度和深度优先搜索);再比如你可能还需要一点点的数学知识(比如位运算、质数)基础。
另外, 网上也有很多算法大佬开源了自己的刷题经验,这些经验都是前辈刷题之后得出的,非常具有参考价值。利用得当的话,可以极大减轻自己的刷题压力。推荐你看看我整理的 《阿里 ACM 大佬开源的 Leetcode 刷题指南》 。
操作系统
相关阅读:八股文骚套路之操作系统
「操作系统基础概念」
操作系统基础相关的概念在面试中也会遇到,不过,这部分内容比较简单,花不了太多时间。
我简单总结了操作系统基础概念中比较重要的知识点:
操作系统的作用、特点、分类、发展
操作系统的结构
内核态和用户态、系统调用
「进程和线程(重要)」
这个是非常高频的考点了!面试官在面试的时候可能会先让你介绍一下进程和线程的基本定义,然后再让你对比一下两者。
问了这些比较基础的内容之后,有些面试官还会顺带问你进程和线程的状态以及各种状态之间的转换。
如果还要继续深入挖的话,面试官可能还会问你 :
进程的通信方式 :进程与进程之前是如何进行通信的。
进程调度算法 :CPU 如何应用不同的调度算法来调度进程。
「内存管理(重要)」
面试官可能会先问一些比较简单的问题比如内存管理的目的、逻辑和物理地址。
比较核心一些的问题还是内存管理机制和内存管理相关的一些概念。
内存管理机制 :像内存管理机制简单分为连续分配管理方式和非连续分配管理方式这两种。非连续分配管理方式比较重要,像分页机制、分段机制、段页式机制都属于非连续分配管理。
内存管理相关概念 :快表和多级页表。
除此之外,虚拟内存和请求分页也非常重要,面试中也经常会遇到。
虚拟内存 :虚拟内存介绍、局部性原理、虚拟内存的实现机制
请求分页 :页表机制、缺页中断、页面置换算法
最后就是死锁相关的内容了,你需要掌握:
死锁的必要条件
死锁预防、避免、检测与解除
「CPU 调度」
CPU 调度这块最重要的就是搞懂几种常见的 CPU 调度算法:
先到先服务调度(First-Come First-Served Scheduling,FCFS)
最短作业优先调度(Shortest Job First,SJF)
优先级调度(Priority Scheduling)
轮转法调度(Round Robin,RR)
......
上面这几种调度算法,大家通过名字应该就能猜出个大概意义了。这些调度算法各有优劣,没有银弹,只能根据具体场景选择具体的调度算法。
因此,多级队列调度(Multilevel Queue) 就诞生了。简单来说就是把就绪队列(存放有待执行进程)分成多个独立队列,每个队列都有自己的调度算法。
「Linux 相关(重要)」
另外的话,操作系统这块还需要对 Linux 相关的知识有所了解:
Linux 常用命令 :比如说创建文件相关的命令、搜索相关的命令
Linux 文件系统 :文件系统原理、硬链接与软链接、目录结构
僵尸进程和孤儿进程
计算机网络
相关阅读:八股文骚套路之计算机网络
「应用层」
HTTP 1.0 和 HTTP 1.1 的主要区别
HTTP 和 HTTPS 的区别
在浏览器中输入 URL 地址 ->> 显示主页的过程
HTTP 请求常见的状态码
Session 与 Cookie 的区别
DNS 域名系统,简单描述其工作原理。
网络安全:DDos、XSS、SQL 注入
「传输层」
面试中计算机网络的问题最常出现在这一章中,非常重要!一定要多花一点心思!
TCP 和 UDP 的区别
TCP 三次握手和四次挥手
TCP 如何解决网络传输的不可靠
「网络层」
IPv4 协议
IP 地址 vs Mac 地址
IP 地址分类,子网划分(笔试常用)
ARP 是地址解析协议工作原理
「网络接口层」
网卡、网桥、交换机的概念?用途?
数据库
MySQL
相关阅读:八股文骚套路之 MySQL 。
SQL 语句(尤其是各种连接查询、分组查询以及各种常见函数的使用)
常用的数据类型、字符集编码
存储引擎(MyISAM 和 InnoDB):InnoDB 是面试考察的重点,相关知识都要详细看。另外要拿 InnoDB 对比 MyISAM、MEMORY 去体会 InnoDB 引擎的特点
索引:
索引优缺点
索引所采用的数据结构(B 树和 B+树)
BTree 索引和 Hash 索引的适用范围
聚集索引与非聚集索引、覆盖索引
索引在哪些情况会失效
事务:
事务的基本概念、数据库事务 vs 分布式事务
ACID
并发事务处理会带来哪些问题
事务隔离级别
undo 日志和 redo 日志的作用
锁机制与 InnoDB 锁算法
数据库多版本并发控制(MVCC 机制)
MySQL 复制 :
MySQL 的主从复制原理
MySQL 的三种复制方式
MySQL 的异步复制和半同步复制
如何提高复制的性能
拓展:
MySQL 的基础架构
一条 SQL 语句是如何被执行的
慢查询优化
Redis
相关阅读:八股文骚套路之 Redis
缓存的基本概念、缓存读写策略( Cache Aside、Read/Write Through、Write Behind)
Redis vs Memcached
Redis 常见数据结构
Redis 线程模型(Redis6.0 之后为何引入了多线程?Redis6.0 之前为什么是单线程?)
Redis 过期数据删除策略
Redis 的持久化策略(RDB 和 AOF)
Redis 内存淘汰机制
缓存穿透、缓存击穿、缓存雪崩发生的原因及解决方案(最高频问题)
基于 Redis 设计一个分布式锁
Redis 事务
Redis 集群
设计模式
设计模式的种类的比较多,不过,面试以及平时工作中最常用的还是下面几个:
单例模式
工厂模式
代理模式
责任链模式
观察者模式
你需要搞懂这些设计模式的核心思想以及代码实现。
并且,最好可以结合自己学过的一些不错的开源框架来说,比如聊到 责任链模式,我们就想到 Netty、MyBatis 中就大量使用到了这个设计模式。
分布式
对于服务端开发来说,分布式相关的知识在大厂面试中非常常见。中小长面试考察的比较少。
CAP 理论和 BASE 理论
Paxo 算法和 Raft 算法
ZAB 协议 :可以结合 ZooKeeper 来谈
Gossip 协议 :可以结合 Redis 来谈
......
总结
上面的内容中,我总结了数据结构、算法、操作系统、计算机网络、数据库等知识点的高频考点。
从文章内容可以看出,我并没有针对具体的某一种编程语言来说。不过,在面试的时候,我们还是要根据具体的公司来分配自己的经历。
比如说字节的面试十分注重代码功底,算法在字节面试中格外重要。并且,字节面试非常重视计算机基础比如操作系统和计算机网络这块,他们会问很多相关的问题。那你准备字节面试的话,就需要将计算机基础放在第一位。
再比如说阿里的面试偏向 Java 生态,像常用的一些中间件、框架经常会成为面试的重点。
推荐阅读: