前言
昨晚逛了逛GitHub,无意中看到一位P8大佬的算法刷题笔记,感觉发现了宝藏!有些小伙伴可能已经发现了,但咱这里还是忍不住安利一波,怕有些小伙伴没有看到。
关于算法刷题的困惑和疑问也经常听朋友们提及,在面试和不少业务中经常问到,但算法就必须依靠牢固的基础和刷题量。算法根基不扎实,不仅难过面试,对于代码性能的提升、编程语言的驾驭也会比别人弱很多。
因此,现在算法基础不牢固的同学,都很难通过大厂的面试。但是只靠刷题去提升算法能力,进度太慢,而且还容易抓不住重点。有了这个笔记的总结,对校招和社招的算法刷题帮助之大不言而喻,果断收藏安利之,完整的算法笔记以为为大家安利好了:2021年度算法真题笔记。
Java算法
1、二分查找
又叫折半查找,要求待查找的序列有序。每次取中间位置的值与待查关键字比较,如果中间位置的值比待查关键字大,则在前半部分循环这个查找的过程,如果中间位置的值比待查关键字小,则在后半部分循环这个查找的过程。直到查找到了为止,否则序列中没有待查的关键字。
public static int biSearch(int []array,int a){
int lo=0;
int hi=array.length-1;
int mid;
while(lo<=hi){
mid=(lo+hi)/2;//中间位置
if(array[mid]==a){
return mid+1;
}else if(array[mid]<a){ //向右查找
lo=mid+1;
}else{ //向左查找
hi=mid-1;
}
}
return -1;
}
2、冒泡排序算法
(1)比较前后相邻的二个数据,如果前面数据大于后面的数据,就将这二个数据交换。
(2)这样对数组的第 0 个数据到 N-1 个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1 个位置。
(3)N=N-1,如果 N 不为 0 就重复前面二步,否则排序完成。
public static void bubbleSort1(int [] a, int n){
int i, j;
for(i=0; i<n; i++){//表示 n 次排序过程。
for(j=1; j<n-i; j++){
if(a[j-1] > a[j]){//前面的数字大于后面的数字就交换
//交换 a[j-1]和 a[j]
int temp;
temp = a[j-1];
a[j-1] = a[j];
a[j]=temp;
}
}
} }
3、插入排序算法
public void sort(int arr[])
{
for(int i =1; i<arr.length;i++)
{
//插入的数
int insertVal = arr[i];
//被插入的位置(准备和前一个数比较)
int index = i-1;
//如果插入的数比被插入的数小
while(index>=0&&insertVal<arr[index])
{
//将把 arr[index] 向后移动
arr[index+1]=arr[index];
//让 index 向前移动
index--;
}
//把插入的数放入合适位置
arr[index+1]=insertVal;
}
}
4、快速排序算法
5、希尔排序算法
6、归并排序算法
7、桶排序算法
8、基数排序算法
9、回溯算法
回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。
10、剪枝算法
11、最小生成树算法
加密算法
1、AES
高级加密标准为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的)。对称加密算法也就是加密和解密用相同的密钥,具体的加密流程如下
2、RSA
RSA 加密算法是一种典型的非对称加密算法,它基于大数的因式分解数学难题,它也是应用最广泛的非对称加密算法....
3、CRC
循环冗余校验(Cyclic Redundancy Check, CRC)是一种根据网络数据包或电脑文件等数据产生简短固定位数校验码的一种散列函数,主要用来检测或校验数据传输或者保存后可能出现的错误....
4、MD5
MD5 常常作为文件的签名出现,我们在下载文件的时候,常常会看到文件页面上附带一个扩展名为.MD5 的文本或者一行字符,这行字符就是就是把整个文件当作原数据通过 MD5 计算后的值,我们下载文件后,可以用检查文件 MD5 信息的软件对下载到的文件在进行一次计算。两次结果.....
力扣算法
1、反转链表=
2、统计N以内的素数
3、寻找数组的中心索引
数组中某一个下标,左右两边的元素之后相等,该下标即为中心索引
思路:先统计出整个数组的总和,然后从第一个元素开始叠加,总和递减当前元素,叠加递增当前元素,知道两个值相等
public static int pivotIndex(int[] nums) {
int sum1 = Arrays.stream(nums).sum();
int sum2 = 0;
for (int i = 0; i<nums.length; i++){
sum2 += nums[i];
if(sum1 == sum2){
return i;
}
sum1 = sum1 - nums[i];
}
return -1;
}
4、删除排序数组中的重复项
public int removeDuplicates(int[] nums) {
if (nums.length == 0) return 0;
int i = 0;
for (int j = 1; j < nums.length; j++) {
if (nums[j] != nums[i]) {
i++;
nums[i] = nums[j];
}
}
return i + 1;
}
5、x的平方根
6、三个数的最大乘积
7、两数之和
8、斐波那契数列
9、环形链表
10、排列硬币
11、省份数量
12、预测赢家
13、香槟塔
14、井字游戏
15、打家劫舍
16、优势洗牌
总结
很多算法题其实本身并不难,难的是细节逻辑方面,如果这些细节方面没有笔记或者有人讲解的话,自己可能要好几天都不一定想的明白,一但被别人点破,只要几分钟可能就能想明白,所以说收集学习笔记和结伴学习都是非常不错学习方式,可以很高的提升自己的学习效率,完整的算法笔记以为为大家安利好了:2021年度算法真题笔记。