- 平衡二叉树
- 任何节点的两个儿子子树的高度最大差别为一
- 红黑树并不追求“完全平衡”——它只要求部分地达到平衡要求,降低了对旋转的要求,从而提高了性能。
- B+树的了解
-
多分支结构有效降低了树的高度
-
B 树的各种操作能使 B 树保持较低的高度,从而达到有效避免磁盘过于频繁的查找存取操作,从而有效提高查找效率
- Trie-Tree 原理及其应用;
-
字典树
-
特点
-
根节点不包含字符,除根节点外的每一个子节点都包含一个字符。
-
从根节点到某一个节点,路径上经过的字符连接起来,为该节点对应的字符串。
-
每个节点的所有子节点包含的字符互不相同。
-
核心思想是空间换时间
-
应用
-
字符串检索
-
词频统计
算法题(剑指 Offer 上原题不少)
-
怎么查询一个单向链表的倒数第五个节点
-
判断链表是否成环
-
两条相交的单向链表,如何求他们的第一个公共节点
-
在无序数组中找最大的K个数?
-
给定n个数,寻找第k小的数,同时给出时间复杂度
-
找一个数组中的第三大数
-
找出数组中第一个出现2次的数,
-
求 1-N 中数字 1 的个数。
-
判断一个数是不是丑数;
-
求第 K 个丑数;
-
10w行数据,每行一个单词,统计出现次数出现最多的前100个。
-
一个文本文件,给你一个单词,判断单词是否出现。
-
一进去要求敲代码二叉排序树的插入、删除及查找
-
某海量用户网站,用户拥有积分,积分可能会在使用过程中随时更新。现在要为该网站设计一种算法,在每次用户登录时显示其当前积分排名。用户最大规模为2 亿;积分为非负整数,且小于 100 万;
-
判断一棵二叉树是否是 BST。
-
一副扑克 54 张牌,现在分成 3 份,每份 18 张,问大小王出现在同一份中的概率是多少;
-
50个白球50个红球,两个盒子,怎么放让人随机在一个盒子里抽到红球概率最高。。。这个就是一个盒子放一个红球,另一个盒子放99个球。
-
logN 查找一个有序数组移动后类似 4 5 6 7 1 2 3里面的一个数
-
0 ~ n 连续 n + 1 数,现在有一个长度为 n 的数组存放了上面 n + 1 个数的其中 n 个,找出哪一个数没有被放进数组
-
将M个平均长度为N的有序队列组合成一个有序队列
-
10亿条短信,找出前一万条重复率高的
-
对一万条数据排序,你认为最好的方式是什么
-
假如有100万个玩家,需要对这100W个玩家的积分中前100名的积分,按照顺序显示在网站中,要求是实时更新的。积分可能由做的任务和获得的金钱决定。问如何对着100万个玩家前100名的积分进行实时更新?
- 除了前100名,后100W-100名玩家的积分,让变化的积分跟第100名比较,如果比第100名高,那就替换的原则。
Java 基础
- Java 的优势
-
语法简单
-
跨平台
-
当开发规模膨胀到一定程度,Java在规范、协作和性能调优上还是占有很大优势,在大型应用,尤其是企业应用上,Java的地位仍然难以撼动
-
boolean 占几个字节
-
如果 boolean 变量在栈上,那么它占用一个栈单元(32-bits)
-
如果在堆上,那么就跟 JVM 的实现有关了
-
在 Oracle 的 JVM 实现,boolean[] 中每个元素占用一个字节(8-bits)
-
Java 访问修饰符权限的区别;
-
public
所有类都可访问 -
protected
只允许包内、子类访问。 -
默认
只允许包内访问 -
private
只允许类内访问
- String 是否可以继承, “+” 怎样实现?
-
String
是final
类,不可继承。 -
+
是通过StringBuilder
(或StringBuffer
) 类,和append
方法实现
- String,StringBuffer,StringBuilder,区别,项目中那里用到了 StringBuffer 或者 StringBuilder
-
String
不可变 -
StringBuffer
,可变,线程安全 -
Stringbuilder
,可变,线程不安全
- String为啥不可变,在内存中的具体形态?
String
使用final char value[]
来存放字符序列。
- Comparable 接口和 Comparator 接口实现比较
-
Comparable 是直接在"被比较"的类内部来实现的
-
Comparator则是在被比较的类外部实现的
- Arrays 静态类如何实现排序的?
- 双轴快排
-
首先检查数组长度,如果比阀值(286)小,直接使用双轴快排
-
否则先检查数组中数据的连续性,标记连续升序,反转连续降序,如果连续性好,使用 TimSort 算法(可以很好的利用数列中的原始顺序)
-
否则使用双轴快排 + 成对插入排序
-
Java 中异常机制。
-
Java 中所有异常都是
Throwable
的子类,他的直接子类有两个,一个是Error
, 一个是Exception
。 -
Error
一般表示 JVM 出现了严重问题,比如说栈溢出或 OOM, -
Exception
中异常分为两类, -
一类是
RuntimeException
表示运行期间出现的错误,比较常见的是空指针异常和数组下标越界,出现这种异常一般是程序出现了逻辑错误,也就是代码有 Bug。 -
另一类是编译时异常(除了
RuntimeException
以外的异常),常见的一般有IOException
等, 出现这种错误程序编译会不通过。 -
还有一种分类方式是
checked exception
和uncheck exception
。unchecked exception
包括Error
和RuntimeExcetion
,checked exception
指之前所说的编译时异常。
- Java 中异常怎么处理,什么时候抛出,什么时候捕获;
-
一般原则是提早抛出,延迟捕获
-
出现异常时,若当前无法处理则抛,否则捕获异常,尝试恢复。
- 说一说对 java io 的理解
-
按照使用的 IO 模型,大致可以分为三类:
-
BIO:JDK1.4 之前的阻塞 IO
-
NIO:JDK1.4 及以后的版本,非阻塞 IO
-
AIO:JDK1.7 之