树的度:分支的个数
哈夫曼树:每次合并权值最小的2个树
哈夫曼编码:
为了尽量减少编码的存储空间,且保准每个字符的编码不互为前缀码。
将使用频率作为权值,构造哈夫曼树。
共用体:其中只有一个(最后一次被赋值的成员)成员保存在变量中。
模板偏特化:
static和派生的关系:
有权图的次最短路径
architecture
implement
approach
二叉树的镜像
写代码的时候要考虑到各种情况。包括NULL,只有一个结点,普通二叉树,二叉树所有结点只有左结点/右结点等。针对下面几种情况都要满足需求。
void MirrorRecursively(TreeNode *pRoot)
2 {
3 if((pRoot == NULL) || (pRoot->left == NULL && pRoot->right))
4 return;
5
6 TreeNode *pTemp = pRoot->left;
7 pRoot->left = pRoot->right;
8 pRoot->right = pTemp;
9
10 if(pRoot->left)
11 MirrorRecursively(pRoot->left);
12
13 if(pRoot->right)
14 MirrorRecursively(pRoot->right);
15 }
泛型算法的find,没有找到则返回第二个参数,而不一定是end()
比较数组相邻元素时注意结束条件
for(int i=0;i<v,size()-2;++i)
size()返回的是unsigned,不会小于0
一个含有n个顶点和e条边得简单无向图,在其邻接矩阵存储结构中共有__个零元素
有n个顶点,所以有n*n个元素,2*e个非零元素(无向图,对称),所以有n*n-2*e个零元素.
static、const、virtual结合使用情况,以下几种可以么:
static void fun(){};
static void fun() const {};
static virtual void fun() const {};
static virtual void fun() {};
以上四种函数可以这样定义嚒? 为什么?
冒泡排序:
- 从第1个数开始,每2个数比较后决定是否进行交换。
- 复杂版的选择排序
for(i=0;i<n-1;++i)
for(j=1;j<n-i;++j)
if(a[j-1]>a[j]) swap(a[j-1],a[j]);
判断链表是否有环:
使用2个指针,第2个指针指向第头节点的后一个。如果有环的时候,第1个指针总有1次会和第2个指针相同。
已知树的节点个数,求树的高度
满二叉树的节点个数为:2^0 + 2^1 +….+2^h = 2^(h+1) - 1
完全二叉树的节点个数为:2^h ~ 2^(h+1) - 1
分治:分解成子问题——》解决子问题——》合并子问题
这么说是因为很多人其实在这些年的项目或是学习中有一些积累,但是在刚开始面试的时候完全感觉使不出力,就是有种你问的我都能讲上一点,但根本说不清楚的感觉。(往深了问自然是完蛋)
知识面或者或者说技术栈都是有宽度和深度的,我们要做的就是在短时间内提升宽度,抓住以往本身就熟悉或是感兴趣的几个点去深入。
我是认为知识的宽度可以很大程度上决定你能不能通过面试(通俗地说是可以讲清原理,不涉及横向对比和优化的方面)
一两个点的深度呢在保证你能通过面试的同时(尤其是你的点正好cover了对方部门的技术栈),并且还是影响offer等级的关键因素。(达到足够的深度,不只能说出原理,还能进行横向技术对比,纵向的延伸技术,优劣点及优化,或者在这个点写了几篇很透彻的博文,更厉害的同学甚至有相关的开源项目的参与与贡献)
剑指offer
数据库(最多的还是mysql,Nosql有redis)
索引(包括分类及优化方式,失效条件,底层结构)
sql语法(join,union,子查询,having,group by)
引擎对比(InnoDB,MyISAM)
数据库的锁(行锁,表锁,页级锁,意向锁,读锁,写锁,悲观锁,乐观锁,以及加锁的select sql方式)
隔离级别,依次解决的问题(脏读、不可重复读、幻读)
事务的ACID
B树、B+树
优化(explain,慢查询,show profile)
数据库的范式。
分库分表,主从复制,读写分离。
Nosql相关(redis和memcached区别之类的,如果你熟悉redis,redis还有一堆要问的)
操作系统:
进程通信IPC(几种方式),与线程区别
OS的几种策略(页面置换,进程调度等,每个里面有几种算法)
互斥与死锁相关的
linux常用命令(问的时候都会给具体某一个场景)
Linux内核相关(select、poll、epoll)
项目经历
这个每个人的项目不同,覆盖的技术也不一样,所以不能统一去说。
这里的技巧呢,在下面也会详细说明。
无非是找到自己项目中的亮点,简历上叙述的简练并且吸引眼球,同时自己要很熟悉这个点(毕竟可以提前准备)
最好自己多练,就像有个剧本或者稿子一样,保证面试中可以很熟练通俗地讲出,并且让人听着很舒服。
实习经历
对实习所做的工作做一个总结,并且同样抓出亮点,搞懂内部原理,提前锻炼讲述的过程。
其他扩展技能(这个方方面面太多了,全部掌握基本上不可能,只是作为大家其他时间扩充技能的参考)