下面将知识点做个总结:
- 链表和数组的区别(内存上的分布、增删查的时间复杂度)
- 树的先根、中根、后根遍历(延伸出来波兰序列和逆波兰序列)
- 双链表的增删查
- 图的深度优先搜索(延伸出回溯法)和广度优先搜索(延伸出分支界限法)
- 掌握几颗树:AVL(平衡二叉树),BST(二叉排序树),红黑树,B树,B+树
- 排序一定要掌握:堆排、基排、快排、冒泡(时间复杂度、空间复杂度、应用场景)
- 常用算法一定要有印象:
- 贪心算法(每次都取最优)
- 动态规划(笔试和面试经常出现,建议看下经典的背包问题)
- 递归算法(斐波列序列、快排、二叉树的遍历、求阶乘),递归一般不能达到最优解,但面试过程中用递归可以使代码更加简短。
- 分治(快排、归并都利用了分治思想)
- 分支界限法(对应广度优先算法)
- 回溯法(对应深度优先算法)
- 典型的算法案例:
- 存储10亿个INT型的QQ号,但给的内存只有1GB。(明显,一个int型占用4个字节,10亿个QQ号就需要4GB的存储空间,直接存储内存不足。)解决方法是利用哈希存储,使用位图(每个QQ号只用一位进行存储,这样一个int型32位就能存储32个QQ号了)
- 在1亿个数中找出前1000个大的数(用int存储),只分配4KB的存储空间。解决这种问题(找出前n个最大或者最小的数),一般使用堆排。前n个最大的数使用最小堆,前n个最小的数使用最大堆
- 找出第k大的数,利用快排(快排的思想就是每次找到一个数在整个序列中的具体位置)
- 大整数乘法,使用分治思想
- 字符串匹配(判断回文串、找出最长回文子串、找出最长回文子序列、判断字符串A是否为字符串B的字序列)
- KMP算法(找出字符串A在字符串B的位置,不存在返回-1)
- 必须会手写的算法
- 快速排序
- 折半查找
- 归并排序
- 链表的逆序
- 链表的生成、查找、删除、添加
- 要掌握写算法的工具,博主练习算法一般使用C++,原因是网上参考例程多,而且执行起来相对高效。
- 要掌握C++的STL库,里面包含了队列、集合、栈等各种数据结构的容器,使用STL可以快速便捷的进行排序、去重、删除、插入、修改、统计大小、逆序(分配的是动态的内存,不像C++的数组一样是固定的)。
- 字符串的常见操作,博主发现很多笔试题喜欢考察字符串相关的题目,所以对字符串的逆序、统计大小、遍历等要重点掌握。
- 这里推荐一本书和一款视频教程,牛客网左大神写的[程序员算法面试指南](https://book.douban.com/subject/26638586/)和哈工大男神郭炜老师的[中国mooc大学程序设计与算法](https://www.icourse163.org/course/PKU-1001894005)
- 三次握手、四次挥手(掌握其原理、以及为什么是这个次数、socket是怎么建立连接的)
- 了解TCP连接的11种状态变迁
- TCP和UDP的区别(报文头部的区别、可靠性?、面向连接?、应用场景)
- 滑动窗口(整个流程、接收窗口和发送窗口是如何移动的、序列和确认号)
- 防拥塞控制(掌握三个阶段:慢启动、拥塞避免、超时重传/快速恢复)
- 七层模型(了解每一层的用途)
- IP地址的分类、私有地址的划分、子网掩码的作用、一些特殊地址的用途(0.0.0.0,127.0.0.1,255.255.255.255)
- 长连接、短连接、长轮询、短轮询
- 常见的应用层协议和相对端口号(FTP,SSH,TELNET,HTTP,DNS)
- 掌握ICMP协议(是网络层协议,应用场景?)
- 推荐两篇计算机网络的博客:[TCP的那些事儿(上)](https://coolshell.cn/articles/11564.html),[TCP的那些事儿(下)](https://coolshell.cn/articles/11609.html)
- 如果服务器用nginx,后端语言为PHP,掌握从用户进行域名访问一个网站到返回页面的过程中经历过的一些活动:(博主这道题答的不太完整)
- DNS域名解析(掌握DNS的轮询机制)
- TCP三次握手建立连接
- 客户端发送HTTP请求报文(在数据包的移动过程中,可能涉及到ARP协议来解析MAC地址---这点博主当时被问的一点懵逼)
- nginx维持连接,并将报文主体发送给php-fpm进行解析并执行
- 服务端发回响应报文
- 服务端或者客户端四次挥手结束会话(注意握手是客户端发起的,挥手是客户端/服务端都能发起)
- 一些常见的状态码:301,302,304,403,404,502,503,504(并且掌握以1、2、3、4、5开头分别表示什么类型的状态)
- HTTP请求报文和响应报文的格式和内容(HTTP报文的4要素、常见的请求首部和响应首部)
- 请求方法:PUT,DELETE,POST,GET,HEAD,TRACE的区别(前4个对应增删改查,重点掌握GET和POST的区别)
- HTTP的缓存首部:如cache-control,max-age,if-modify-since,last-modify
- 会话:SESSION和COOKIE的区别,如何提高COOKIE的安全性(这里可能会涉及到WEB攻击,如CSRF和XSS)
- 进程和线程
- 进程与线程的联系和区别,顺便了解一下创建进程和线程的方法
- 进程的调度算法
- 进程的通信机制:管道、有名管道、消息队列、共享内存、socket(要掌握这几种通信方法的区别)
- 死锁产生的原因、如何检测死锁、如何解决死锁
- 线程的同步机制:临界区、互斥量、信号量、条件变量
- 用户态和内核态的区别(博主一般是从特权级考虑的)
- 并发和并行的区别
- 内存
- 内存的分页机制、页表以及多级页表
- 内存碎片(外碎片和内碎片)
- 段页结合(实现机制、为什么要使用这种机制?)
- 缺页错误
- 虚拟内存
- 页面调度算法
- 磁盘:了解磁道和扇区的概念
- 编译和链接
- 了解基本的编译流程(词法分析、语法分析、语义分析)
- 了解链接器的作用
- 32位机和64位机中数据类型的区别(long和指针所占字节不一致)
- **多态-----虚函数**:[浅谈C++虚函数](https://www.cnblogs.com/malecrab/p/5572730.html)
- 虚函数的实现原理
- 加了虚函数后,调用构造函数和虚构函数的区别
- 类和结构体:
- **占用内存**(要考虑内存对齐的问题)
- 类和结构体的区别(博主一般以类是引用类型,结构体是值类型入手)
- C++的分段机制(代码段、数据段、BSS、堆、栈)以及每个段的作用
- 动态分配内存(堆):了解new/malloc,delete/free的区别
- 掌握strlen和sizeof的区别
- 内联函数和宏定义的区别
- 三大范式+BCNF范式
- 数据库的索引(B树索引、哈希索引、位图索引)
- INNODB和MYIASM的区别
- 查询优化
- 合理建立索引:[MYSQL索引背后的数据结构](https://www.cnblogs.com/tgycoder/p/5410057.html)
- 优化SQL语句
- IN、EXTISTS、JOIN的区别和应用场景
- 防止索引失效
- 事务的四大特性:原子性、隔离性、永久性、一致性
- 隔离性解决的问题:污渎、不可重读、幻读(理解这三者的区别)
- 防止SQL注入的方法
- 危险字符的转义
- 对SQL预编译
- Redis缓存机制
- 应用场景和优点
- 与memcache的区别
- 如何实现持久性
- 主从模式
- 7种结构模式以及应用场景:桥接模式、适配器模式、代理模式、享元模式、组合模式、门面模式、装饰模式
- 重点掌握单例模式和MVC模式(应用场景、优缺点)
- 了解UML图,能看懂各种不同箭头表示的意思。[详解UML类图](http://www.uml.org.cn/oobject/201610282.asp)
- linux的文件系统:[详见linux文件系统](http://www.cnblogs.com/bellkosmos/p/detail_of_linux_file_system.html)
- 常见的命令
- vim的基本使用:掌握三种模式(命令模式,插入模式和底行模式)
- 查询进程的相关指令:ps -aux/ps -ef
- 查询相关端口的指令:netstat -ntl
- 查询内存使用状态:free -h
- 基本的操作:复制,删除,重命名,移动
- 设置开启自启动
- 设计定时执行
- 防火墙的设置:[linux中iptables的设置](http://blog.chinaunix.net/uid-25885064-id-3351852.html)
- 看得懂nginx的配置文件,并了解如何配置域名/端口重定向,以及如何负载均衡
- 了解IO复用技术:poll/select,epoll的区别
- 说明:由于博主主要掌握的后端语言为PHP,所以后端语言为JAVA/C的请略过此小节。
- include和require的区别
- PHP常见的魔方方法:__toString,__autoload,__isset,__call等
- PHP七个超全局变量:_GET,_POST,_REQUEST,_SERVER,_COOKIE,_SESSION,_FILES
- isset和empty的区别
- 弱类型语言是如何标识类型的,以及垃圾回收机制
- PHP作为一种解释型语言,是如何执行的
- PHP7相对于PHP5的优点,[强烈推荐鸟哥的博客](http://www.laruence.com/)
- 了解php_module、fast-cgi和php-fpm的区别
- 掌握正则表达式的相关语法,并可以手写简单正则表达式,如手机号码、邮箱等
华丽的分割线过后,下面博主给大家带来的一些面试的小问题。
项目:面试IT行业一定要有拿得出手的项目,不然真的很尬,面试官一般会从以下几个角度发难:
面试过程:
简历:
心态
其他
###华丽的分割线后,感谢各大网站给我如此方便的刷题和答疑解惑环境
知乎
CSDN
博客园
牛客网
leetcode