Less than 1 minute
常用的位操作
Java中的位操作符
注意
Java
中位操作符的操作数只能是整型(byte、short、int、long)
和字符型数据(char)
。Java
中位操作符一共有7个,其中4个是位逻辑运算符,3个是移位运算符。- 使用按位操作符时要注意:相等
(==)
与不相等(!=)
的优先级在按位操作符之上!这意味着,位运算符的优先级极小,所以使用位运算符时,最好加上括号。
About 27 min
手写LRU缓存淘汰算法
LRU算法描述
LRU算法设计
代码实现
手写LFU算法
算法描述
思路分析
代码框架
LFU核心逻辑
二叉树搜索树操作集锦
判断BST的合法性
在BST中查找一个数是否存在
在BST中插入一个数
在BST中删除一个数
完全二叉树的节点数为什么难算
思路分析
About 1 min
学习算法和刷题的框架思维
学习解决问题的思路、套路、框架,养成“框架思维”,不应该纠结于问题的细节,把握问题的共性和本质,做到举一反三。
数据结构的存储方式
数据结构的底层存储方式只有两种:数组(顺序存储)和链表(链式存储)
。
其他的数据结构,比如哈希表、栈、队列、堆、树、图等都是属于具体的上层建筑,都是在数组或者链表上的特殊操作,只是API
特性不同而已。
数组
数组由于是紧凑连续存储,因此可以随机访问,通过索引快速找到对应的元素,而且相对节约存储空间。但正因为连续存储,内存空间必须一次性分配足,所以数组如果要扩容,需要先重新分配一块更大的空间,再把数据全部复制进去,时间复杂度为O(N)
;而且如果想在数组中间和开始位置进行插入和删除操作,每次必须移动后面的所有数据以保持连续,时间复杂度为O(N)
。
数组在开始、中间、最后位置的增删改查分析如下:
- 开始位置:增加和删除都需要挪动元素,所以效率不高,但是查询和修改就比较高效。
- 中间位置:增加和删除都需要挪动元素,所以效率不高,但是查询和修改就比较高效。
- 最后位置:增加和删除位置不需要挪动元素,效率比较高,同时查询和修改效率也比较高。
About 25 min
Less than 1 minute
如何高效寻找素数
素数
如果一个数只能被1和它本身整除,那么这个数就是素数。
实现一个函数,输入一个正整数n
,函数返回区间[2,n)
中素数的个数。
函数签名如下:int countPrimes(int n)
一般实现
/***
* @Description: [2, n)素数的个数
* @Author: Mr.Tong
*/
int countPrimes(int n) {
int count = 0;
for (int i = 2; i < n; i++) {
if (isPrime(i)) {
count++;
}
}
return count;
}
/***
* @Description: 判断一个数是不是素数
* @Author: Mr.Tong
*/
boolean isPrime(int n) {
for (int i = 2; i < n; i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
About 4 min