数学运算

常用的位操作

Java中的位操作符

注意

  • Java中位操作符的操作数只能是整型(byte、short、int、long)和字符型数据(char)
  • Java中位操作符一共有7个,其中4个是位逻辑运算符,3个是移位运算符。
  • 使用按位操作符时要注意:相等(==)与不相等(!=)的优先级在按位操作符之上!这意味着,位运算符的优先级极小,所以使用位运算符时,最好加上括号。

Isaac ZhouAbout 27 min算法数据结构算法数据结构
数据结构

手写LRU缓存淘汰算法

LRU算法描述

LRU算法设计

代码实现

手写LFU算法

算法描述

思路分析

代码框架

LFU核心逻辑

二叉树搜索树操作集锦

判断BST的合法性

在BST中查找一个数是否存在

在BST中插入一个数

在BST中删除一个数

完全二叉树的节点数为什么难算

思路分析


Isaac ZhouAbout 1 min算法数据结构算法数据结构
核心套路

学习算法和刷题的框架思维

学习解决问题的思路、套路、框架,养成“框架思维”,不应该纠结于问题的细节,把握问题的共性和本质,做到举一反三。

数据结构的存储方式

数据结构的底层存储方式只有两种:数组(顺序存储)和链表(链式存储)

其他的数据结构,比如哈希表、栈、队列、堆、树、图等都是属于具体的上层建筑,都是在数组或者链表上的特殊操作,只是API特性不同而已。

数组

数组由于是紧凑连续存储,因此可以随机访问,通过索引快速找到对应的元素,而且相对节约存储空间。但正因为连续存储,内存空间必须一次性分配足,所以数组如果要扩容,需要先重新分配一块更大的空间,再把数据全部复制进去,时间复杂度为O(N);而且如果想在数组中间和开始位置进行插入和删除操作,每次必须移动后面的所有数据以保持连续,时间复杂度为O(N)

数组在开始、中间、最后位置的增删改查分析如下:

  • 开始位置:增加和删除都需要挪动元素,所以效率不高,但是查询和修改就比较高效。
  • 中间位置:增加和删除都需要挪动元素,所以效率不高,但是查询和修改就比较高效。
  • 最后位置:增加和删除位置不需要挪动元素,效率比较高,同时查询和修改效率也比较高。

Isaac ZhouAbout 25 min算法数据结构算法数据结构
高频面试

如何高效寻找素数

素数

如果一个数只能被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;
}

Isaac ZhouAbout 4 min算法数据结构算法数据结构