
数据结构与算法
数据结构与算法
java_t_t
拿CSDN当笔记本
展开
-
HashMap源码浅析
HashMap底层结构:数组+链表(或红黑树)Node<K,V>[] tab1.put1.计算key的hash值2.如果HashMap中的数组为空,或者长度为0,先扩容3.通过 (<数组长度> - 1 ) & hash 计算出当前元素下标,如果没有碰撞,直接将kv添加到数组中4.处理hash碰撞(准确的说是下标碰撞)的情况4.1.key相同时,需要更新,放到后面统一处理(hash相同,key不一定相同;key相同,hash一定相同).原创 2020-07-27 18:29:32 · 206 阅读 · 0 评论 -
List、Tree互转工具类
List、Tree互转工具类原创 2022-03-25 23:37:13 · 1713 阅读 · 2 评论 -
获取树深度
概要:使用BFS(广度优先搜索)、DFS(深度优先搜索)的递归和非递归方式获取树深度。代码:Util类:package com.example.study.util;import org.springframework.util.CollectionUtils;import org.springframework.util.StringUtils;import java.lang.reflect.Field;import java.util.ArrayList;import ja原创 2022-02-27 23:38:08 · 945 阅读 · 0 评论 -
求经过两点的直线的表达式(Leetcode.149)
在刷Leetcode的时候,第149题需要求经过两点的直线的表达式,所以总结一下如何用代码求出经过两点的直线的表达式注:只考虑 x, y 为整数的情况,且不考虑计算中整型溢出的情况求直线表达式需要解决的问题1.求坐标系中经过两点的直线的表达式表达式的形式为:y = a * x + b根据两个点的坐标得到方程式:①. y1 = a * x1 + b ②. y2 = a * x2 + b得出 a 和 b 的表达式为(x1 - x2 不为 0 的情况下):a = (y原创 2021-08-22 00:57:55 · 2427 阅读 · 0 评论 -
next permutation函数
介绍:给定一个排列好的数字数组,这些数字的所有排列组合组成的数组的有序集合中,求给定数组所在集合中的位置的下一个数组(若已到最后一个数组,下一个数组为第一个数组)算法步骤:1.从右到左进行扫描,发现第一个违背递增趋势的数字,称之为 PartitionNumber2.从右到左进行扫描,发现第一个比 PartitionNumber 要大的数,称之为 ChangeNumber3.交换 PartitionNumber 和 ChangeNumber4.反转在 PartitionNumbe.转载 2020-09-24 16:56:39 · 246 阅读 · 0 评论 -
md5加密
概述:md5哈希散列算法md5加密是单向不可逆的哈希散列算法,对于任意长度的明文进行md5运算后,可以得到128bit的密文。实现:1.md5散列借助java自带的java.security.MessageDigest进行; 2.对128bit(16byte)的byte数组进行拆分,每byte拆成2个16进制数,高位在前,高位在前,低位在后代码实现:import java.io.IOException;import java.io.InputStream;imp...原创 2020-06-18 23:57:23 · 209 阅读 · 0 评论 -
位图法bitmap
概述:位图法bitmap 位图法是用一个bit的0/1代表这个bit所在位置的值存在与否 注:为什么不用boolean数组? 根据《Java虚拟机规范》一书中的描述:“虽然定义了boolean这种数据类型,但是只对它提供了非常有限的支持。在Java虚拟机中没有任何供boolean值专用的字节码指令,Java语言表达式所操作的boolean值,在编译之后都使用Java虚拟机中的int数据类型来代替,而boolean数组将会被编码成Java虚拟机的byte数组,每个元素boolean...原创 2020-06-14 20:57:40 · 538 阅读 · 0 评论 -
根据年月日获取星期
蔡勒公式实现:public class DayOfWeek { public static int[] maxDay = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; public static int dayOfWeek(int year, int month, int day) { if (...原创 2020-03-19 23:28:44 · 779 阅读 · 0 评论 -
Base64加解密
概述:base64加解密对英文字符的base64加解密,非英文字符由于编码问题,本文未支持。base64的加密过程规则是这样的: 1.将字符串中的每一个字符,转换成其对应的ASCII码值的二进制表示,每个字符的二进制长度为8位,得到二进制字符串; 2.若得到的二进制字符串长度不是6的整数倍,末尾添加0,使其为6的倍数; 3.在步骤2得到的字符串中,每6位截取,其对应...原创 2020-02-19 23:41:58 · 446 阅读 · 0 评论 -
有序链表的合并的一种实现
概述:合并有序链表的一种实现在Leetcode刷题的时候,碰到有序链表的合并问题,第21题是两个链表的合并,第23提是k个链表的合并,第23题利用第21题的解法,将两个链表合成一个,再把合成的链表作为新链表和下一个链表合并即可。合并链表有很多方法:a.将所有节点拆开,放到数组里进行排序,再放回链表,这种方法实现最简单,但是放弃了链表本身插入删除成本低的优势;b.另一种方法是分别遍历两个链表...原创 2019-09-26 21:34:48 · 178 阅读 · 0 评论 -
特殊矩阵的压缩存储(下)
概述:主要是实现稀疏矩阵的三元组存储和十字链表存储稀疏矩阵:稀疏矩阵是指矩阵中非零元素个数远远小于矩阵元素总数,且分布没有规律的矩阵。a.三元组存储 三元组的存储原则是指存储非零元素,包括元素的位置和值。b.十字矩阵存储 当稀疏矩阵的元素个数和位置经常发生变化时,不宜采用三元组存储,应该采用链式存储,在十字链表中,除了存储结点本身的信息(位置、值),还存储了指向当前行的...原创 2019-09-26 00:58:14 · 296 阅读 · 0 评论 -
特殊矩阵的压缩存储(上)
概述:主要是推导出上/下三角矩阵、对称矩阵存储在一维数组中的方法a.下三角矩阵 一个n×n阶矩阵,i为行下标,j为列下标,i>=j的部分构成的三角矩阵,称为下三角矩阵,形式如下: a[0,0] a[1,0] a[1,1]a[2,0] a[2,1] a[2,2] 存储一个矩阵最直观的就是用二维数组存储,如果用一维数组存储的话,就会有一个...原创 2019-09-25 19:29:29 · 1809 阅读 · 1 评论 -
KMP模式匹配算法
概述:实现KMP模式匹配算法KMP算法:串的模式匹配指的是在主串中查找模式串的过程,主要有Brute-Force算法和KMP算法 Brute-Force算法: Brute-Force算法是最简单的暴力查找,它从主串的第一个字符开始和模式串的第一个字符进行比较,如果相等,则继续比较后续字符;否则从主串的第二个字符开始和模式串重复前一步操作,直到模式串的所有字符都和主串匹配上...原创 2019-08-26 22:06:38 · 275 阅读 · 0 评论 -
数据结构—队列
概述:实现一个FIFO(先进先出)的队列实现思路: 同样可以用数组和链表来实现:用数组实现队列的弊端和用数组实现栈的弊端是类似的,不再赘述;用链表实现,通过在尾节点添加元素实现往队列添加元素,通过从头节点删除一个元素实现从队列删除元素,添加和删除队列中的元素的效率和队列数据大小无关。注意:用链表实现队列的时候,另一种方式是和上面刚好相反:在头节点添加数据,而在尾节点删除数据。由...原创 2019-06-09 13:07:42 · 183 阅读 · 0 评论 -
数据结构—栈
概述:实现一个LIFO(后进先出)的栈实现思路: 可以用数组和链表来实现:数组长度是固定的,一旦定义无法改变,所以需要预先定义一个默认的数组长度,当栈容量到达一定程度后,需要重新定义一个数组,并将当前数组的数据复制到新数组中,当栈元素很多的时候,效率会比较低;用链表实现,入栈和出栈都在链表的头部添加和删除元素,入栈出栈的效率和栈数据大小无关,所以我们选择用链表实现栈。实现:...原创 2019-06-09 12:58:29 · 118 阅读 · 0 评论 -
数据结构—单向链表
概述:实现一个带头节点的单向链表单向链表: 所谓单向链表,指的是只能从头部往尾部遍历的链表。 单向链表的每个节点有两个区域,一个用来存储数据,另一个用来指向下一个节点。实现:public class LinkList<T> { /** * 节点类 */ private class Node<T> { ...原创 2019-01-27 22:47:53 · 331 阅读 · 0 评论 -
矩阵转置
概述: 实现 n×m 的矩阵的顺时针、逆时针旋转,以及n×n的矩阵沿 y=x 和 y=-x 的对折。实现思路: 对于矩阵转置这一类问题,关键在于找出转置前后的位置关系。 以2×3的矩阵的顺时针旋转为例: 原矩阵: 1,2,3 4,5,6 转置后: 4,...原创 2018-12-16 00:12:55 · 1118 阅读 · 0 评论 -
大数四则运算(加、减、乘、整除、求余)
概述: 实现参与运算的数或者运算结果中,长度最大的一个数的位数,不超过String类型最大长度的大数的四则运算。实现思路: 加法:模拟笔算的过程,逐位运算; 减法:先比较大小,让较大的数作为被减数(被减数-减数=差),再仿照加法运算; 乘法:和加法类似,逐位运算; 除法(整除):除法比较复杂一点,是用连续相减实现。不过用被除数逐个减除数显然太慢了,我...原创 2018-12-09 23:27:49 · 721 阅读 · 0 评论 -
常见排序算法实现
1、冒泡排序public class Bubble { public void sort(int[] a) { for (int i = a.length - 1; i > 0; i--) { for (int j = 0; j < i; j++) { if (a[j] > a[j + 1]) { a[j] = a[j] ^ a[j + 1]; a[j...原创 2018-05-03 17:39:02 · 218 阅读 · 0 评论