- 博客(62)
- 收藏
- 关注
原创 优选算法的巧思之径:模拟专题
先初始化两个指针left和right,比较left和right是否相等,相等right就向右移动,当right的指向与left不相等时,right就停止,此时的left直接移动到right的位置。我们以示例1为例,先创建一个n行的矩阵,先向下填充,当x=n时,开始右上填充,当x=0时,又开始向下填充……如上图,k后面又是c,我们还需要给c记录上1,而我们要求的是所需不同青蛙的最少数目,所以我们从k里面借一个1,再去遍历最后一个"croak",最终k里面存的就是最终结果。当遍历到c时,哈希表中c加1。
2025-03-31 21:31:14
621
13
原创 MySQL数据库精研之旅第五期:CRUD的趣味探索(上)
CURD是对数据库中的记录进行基本的增删改查操作:Create(创建)、Retrieve(检索)、Update(更新)、Delete(删除)。
2025-03-30 16:12:36
1039
59
原创 优选算法的慧根之翼:位运算专题
我们假设数组中出现三次的数字有n个,只出现一次的有1个,数组里的元素都是int类型的,我们从第0位开始遍历,让每一个数相同位数的比特位相加,那么它们的相加一共可以出现如下图4种情况。共包含6种&(按位与,有0就是0)、|(按位或有1就是1)、^(按位异或,相同为0,相异为1)、~(按位取反,0变成1,1变成0)、<<(左移)、>>(右移)。但我们需要注意的是,进位不是进到它本身这一位来,而是要进到左边这一位上来,所以我们还需要将按位与的结果左移1位,直到左移的结果为0。只需要将第x位修改为1,其他位不变。
2025-03-29 08:45:22
1241
32
原创 MySQL数据库精研之旅第四期:解锁库操作高阶技能
"ADD"表示添加,"FIRST"表示加到表的第一列,"AFTER"表示加到某一列的后面;"DROP"表示删除;前面我们讲到过,MySQL软件里面管理着很多数据库,数据库里面又管理着很多表,表里面又管理着很多数据行。"Field"是列名,"Type"是数据类型,"NULL"表示当前列是否可以为空,"Key"表示是否创建了索引,"Default"是当前列的默认值,"Extra"表示扩展信息。如果我们在可视化工具上查看,右键想要查看的表,点击“设计图”,表里面的数据行一目了然,尤其是在数据行比较多的情况下。
2025-03-26 21:19:32
1036
43
原创 优选算法的睿智之林:前缀和专题(二)
我们先来回顾一下二位前缀和的计算:dp[i][j] = dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1] + mat[i][j]。如果我们要在预处理矩阵dp[x][y]里面里的值,我们需要在mat[x-1][y-1]的位置找,在answer[x+1][y+1]的位置填入。我们先来思考暴力枚举:利用双指针left和right,当right移动到某一个位置时,left与right构成的区间之和为k时,此时right不能停止,数组元素可能为负的,有可能后面还存在和为k的子数组。
2025-03-26 08:32:10
1072
35
原创 MySQL数据库精研之旅第三期:数据类型背后的秘密
关于DECIMAL是如何实现精度不受损失的,其实是对一个大数每9位进行拆分,每一份用int来储存,int最大可以储存21亿的数字,再用诺干个int进行表示,而剩余的小数部分则用最小的数据类型来存储。对于文本类型和二进制类型,我们用记事本的形式打开一个Excel文档,会发现里面都是我们看不懂的一堆乱码,这就是二进制类型。我们知道,库是管理数据的最大集合,库里面有很多的数据表,表是由数据行构成的。类是⾯向对象中的概 念,对应到数据库中的概念就是实体,类中的属性对应实体中的属性。
2025-03-25 10:55:02
739
48
原创 优选算法的睿智之林:前缀和专题(一)
A区域的和可以很好的算出来:dp[i-1][j-1],但是B、C区域的和又不好算了。我们需要求的是某段数组元素的和,那么就可以利用前缀和思想,i左侧的元素之和f(i) = f(i-1) + nums[i-1],i右侧的元素之和g(i) = g(i+1) + nums[i+1]。第一步,我们先预处理出一个前缀和数组int[] dp,dp[i]代表的是arr数组区间[1,i]的和。而数组dp中每一个元素的算法不用再从头加到尾,直接利用递推公式dp[i] = dp[i-1] + arr[i]。
2025-03-23 18:46:29
873
34
原创 MySQL数据库精研之旅第二期:库操作的深度探索
已有库里面的“sakila”“world”这些属于测试库,我们可以进行修改或者删除的,“information_schema”“mysql”“performance_schema”“sys”这些都属于系统库,记录的是MySQL自身信息和一些配置项,其中也包含我们的用户名和登录密码。大括号里的内容必须存在;对字符集的编码,相当于两个人用不同的语言进行交流,一个人用汉语,另一个人用英语,他们就相当于对相同的内容进行编码。如果我们再去创建一个同名称的数据库,就会发出警告,并会告诉我们警告信息该数据库已经存在。
2025-03-22 16:14:33
1144
56
原创 MySQL数据库精研之旅第一期:开启数据管理新旅程
数据库是20 世纪 60 年代末发展起来的⼀项重要技术,已经成为计算机科学与技术的一个重要分支。数据库技术主要是⽤来解决数据处理的⾮数值计算问题,数据处理的主要内容是数据的存储、查询、修改、排序和统计等。SQL(Structured Query Language)是结构化查询语⾔的简称,是⼀种数据库查询和程序设计语⾔, ⽤于存取数据以及查询、更新和管理关系数据库。MySQL语言的学习本质也是SQL语言去操作数据库,SQL相当于一个标准,不同的厂商运行不同的数据库会略微有不同的差别,但总体还是在大的框架以内。
2025-03-19 15:27:33
1063
54
原创 优选算法的匠心之艺:二分查找专题(二)
通过上面的示例1,我们可以很明显地发现“二段性”,左边是严格大于某个值的递增区间,右边是严格小于某个值递增区间,并且数组中没有重复元素,折线表示如下图所示。从上图中我们已经可以看出,数组已经被分成两段,左边是递增的,右边是递减的,符合“二段性”,可以利用二分查找。我们注意一个细节:如果给定的数组为[0,1,2,3],数组元素与下标都是一一对应的,而缺失的数字为最后一个元素加一。在缺失的数字之前,数组元素与数组下标是一一对应的,到缺失的位置时,缺失的数字比数组元素小1。或者是递增的,或者是递减的。
2025-03-17 14:55:52
1486
52
原创 Java数据结构第二十三期:Map与Set的高效应用之道(二)
扩容的时候还需要注意,比如我们要插入的元素的key为14,扩容前需要插入下标为4的位置,扩容2倍后,就需要插入下标为14的位置。理想的搜索⽅法:可以不经过任何比较,⼀次直接从表中得到要搜索的元素。我们的基本思路是:利用HashSet,先遍历一遍数组,把集合中没有的数字放入,如果有,再移除,最后集合中剩下的元素就是只出现一次的数字,再遍历一遍数组,匹配HashSet中的数组。由于我们哈希表底层数组的容量往往是小于实际要存储的关键字的数量的,就会导致冲突的发⽣是必然的,但我们能做的应该是尽量的降低冲突率。
2025-03-15 21:26:26
1222
33
原创 优选算法的匠心之艺:二分查找专题(一)
当x与目标值进行比较时,left可以移动到x右边,那么x的左边已经判断过了都是小于目标值,但右边还是未知的,即使left与right相遇,那这个数依然是未知的。right指针移动的时候,一直是在合法的区间,left一直想要跳出这个不合法的区间,直到两个指针相遇,无需判断,相遇的位置就是我们要找的结果。我们先来思考暴力解法:由于x是非负整数,那么x的平方根定义是小于等于x的。如果x=17,我们可以从1开始向右枚举,如果找到一个数n,n*n小于等于x,且(n+1)*(n+1)大于x,则x的平方根则为n。
2025-03-14 20:58:02
1051
52
原创 Java数据结构第二十二期:Map与Set的高效应用之道(一)
上面的TreeMap传给了m,m是NavigableMap类型的,而NavigableMap又继承了Map,我们再来看add方法,里面的e接收了key,PRESENT接收了value,而这个PRESENT又是一个Object类。对有n个结点的⼆叉搜索树,若每个元素查找的概率相等,则⼆叉搜索树平均查找⻓度是结点在⼆叉搜 索树的深度的函数,即结点越深,则比较次数越多。如果相等,直接返回这个结点。Map是⼀个接⼝类,该类没有继承⾃Collection,该类中存储的是结构的键值对,并且K⼀定是唯一的,不能重复。
2025-03-11 21:53:12
1303
39
原创 Java数据结构第二十一期:解构排序算法的艺术与科学(三)
我们先定义三个指针,先让三个指针同时指向三个数组的第一个下标,比较nums[s1]与nums[s2]的值。我们对数组里的元素进行分组,每一个单独的元素都是有序的;由于合并需要3个参数,根据上一种做法的分析,left=i,mid=left+gap-1,right=mid+gap。类似于快速排序,利用数组下标的中间值mid进行分解,当left=right时,说明左树已经分解完毕,然后再去分解右树,然后再进行排序与合并。这样临时数组中储存的就是有序数据,但原数组还不是有序的,我们将临时数组拷贝到原始数组中。
2025-03-09 20:58:13
5977
27
原创 Java数据结构第二十期:解构排序算法的艺术与科学(二)
这种选择排序的思路是从首尾找,起始两个值接收下标都为0,利用i去遍历数组,找出最大值与最小值下标,再让left下标的值与MinIndex下标的值交换,right下标的值与MaxIndex下标的值交换。无论是递归左边还是右边,与上面的过程都是一样的。与上面的方法类似,我们依然是以6为基准值,把6存进tmp中,right向左移动,遇到比6小的数,把6之前的位置填上;但我们一运行,就会发现,排序出现了问题,这是因为,如果最大值或最小值本身就在首尾,那么一交换,最大值或最小值就会跑掉,,所以我们还需要判断一下。
2025-03-09 00:42:52
6257
32
原创 Java数据结构第十九期:解构排序算法的艺术与科学(一)
插入排序的过程:让i从第二个元素为起始位置,j=i-1,当arr[j]>arr[i],用tmp接收i下标的值,让j下标的元素向前移,然后让j--,如果tmp的值大于j下标的值,就把tmp的插入j的后面;假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的 相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之 前,则称这种排序算法是稳定的;如果gap非常大的时候,那么j回退的次数就越少,几乎可以认为是常数。
2025-03-07 23:21:13
1274
48
原创 Java数据结构第十八期:探索优先级队列的魅力(二)
我们来看一下Integer里面的源码,在Structure里面找到compare(int ,int),因为10>5,进不来上面的循环,就可以走下面的代码,再把0下标给到5元素,从而实现小根堆。除此之外,还有第三种解法,就是利用大根堆。先建立一个大小为k的大根堆,从数组的第k+1个元素开始遍历数组,如果数组元素比堆顶元素小,则交换,遍历结束之后,大根堆里的元素就是最小k个数。offer的源码如下,从下面的逻辑中可以看出,它的向上调整是一个一个实现的,而不是直接去调整一个数组,所以下面的时间复杂度是。
2025-03-07 10:56:06
1103
9
原创 Java数据结构第十七期:探索优先级队列的魅力(一)
队列是⼀种先进先出(FIFO)的数据结构,但有些情况下,操作的数据可能带有优先 级,⼀般出队列时,可能需要优先级⾼的元素先出队列,在某些场景下,比如在手机上玩游戏时,有人打电话,系统就会优先处理打过来的电话。对于元素的删除,我们先删优先级最高的“65”,这个方法非常巧妙:我们先把"65"与最后一个结点下标的元素进行交换,再利用向下调整再变成大根堆(在这个过程中65不参与调整)就是左结点,但有可能这个左结点是不存在的,所以我们需要判断这个下标是否是合法的,并且不能只判断一次,因为c会随着p的值发生变化。
2025-03-06 11:01:06
5697
32
原创 优选算法的智慧之光:滑动窗口专题(二)
只不过这次的count是统计字符的种类,因为在找字母异位词时,子串和字符串是一一对应的关系,这里字符却是大于等于的关系。我们看下图,我们从s中找出一段符合要求的子串,然后让left向后移动一步,此时会出现两种情况,要么缩小的区间还是符合要求,要么不符合要求,我们就让right向右移动,并且在这期间right是不需要回退的。我们还是先来思考一下暴力解法:先定义两个指针,我们以其中一个指针为起点,另一个指针向右移动,找到所有符合条件的子串,从里面挑出最短的长度。进窗口,把s中的字符串丢进哈希表中统计。
2025-03-03 23:06:35
6334
66
原创 Java数据结构第十六期:走进二叉树的奇妙世界(五)
当遍历到4时,左子树为空,返回结点4并弹出,再去遍历4的右结点,然后返回结点2并弹出,让cur等于结点2的右子树并遍历。代码写到这里就会出现问题,原因是:当遍历到结点4的时候,4的左子树为空,就无法进入while循环。然后把4弹出去,让cur=top,问题又来了,如果结点4左边要是不为空,又得放入栈中,也需要走while循环。如下图,前序遍历肯定是先将根结点放进去,如果是队列,根结点先进先出,然后怎么去遍历右子树呢,就无法打印的顺序了。但这样写,会存在问题:当遍历到结点5的右结点7时,会陷入死循环。
2025-03-02 14:21:14
858
34
原创 Java数据结构第十五期:走进二叉树的奇妙世界(四)
我们以中序遍历的数组的第一个元素ibegin,最后一个元素iend之间找到二叉树的根,因为是前序遍历,先有的左树再有的右树,那么左边的区间就会是(9,x) = (ibegin,iend),iend = iroot-1;再继续往下走,如果root.right为空,正好符合上面2结点的情况:2的左边走完,右边为空,直接return加右括号。通过上图分析:当1的左子树不为空,就用一个(,2的左子树也不为空,也使用一个(,4再往下递归返回null,直接)闭合;当root的左树不为空,右树为空,也加右括号闭合。
2025-03-01 19:34:26
1250
31
原创 优选算法的智慧之光:滑动窗口专题(一)
因为数组是具有单调性的,两个指针不用回退,就可以省去很多不必要的枚举,让子数组里的元素不停进出,维护更新子数组的和。是不需要的(如下图所示),right要么不动,要么向右移动,此时又符合同向双指针的解法,也就是可以使用滑动窗口。我们取出一段子数组,里面的水果种类kinds恰好为2,此时让left向右移动,会出现两种结果:kinds不变,right也不需要向右移动;“判断”,当子数组的和大于target时(这里不写等于,是为了防止代码书写混乱的),left指针向左移动,完成“出窗口”的操作;
2025-02-27 22:53:18
1876
56
原创 Java数据结构第十四期:走进二叉树的奇妙世界(三)
实现的逻辑也非常简单:求出每棵子树的高度,如果左子树的高度与右子树的高度之差小于等于1,则是平衡二叉树。看下面的三棵二叉树,上面的树存储的值相同,结构也相同;一棵树的本身就是它的子树,所以我们要首先判断两棵树是否相同,再去判断subRoot是不是等于root的左子树还是右子树,判断我们可以依照上面讲过的是否是相同的树来判断。要判断二叉树是否是对称的,也就是判断左右子树是否是对称的(如下图所示)。root.left与root.right是否是对称的,再判断下面的子结点是否对称,也就是递归的条件。
2025-02-26 00:15:56
6295
35
原创 Java数据结构第十三期:走进二叉树的奇妙世界(二)
同样的,我们上面已经实现了二叉树结点的遍历,我们也只需要再定义一个计数器,只要root不为空,countNode就递增。每一个节点的遍历顺序都是按照“根——>左子树——>右子树”的顺序来遍历,每遇到一个新的结点都看作是一棵新的树。求二叉树的高度,整棵树的高度等于左子树高度的最大值或者右子树高度的最大值加一,当root为空的时候,高度为0。中序遍历的顺序为“左子树——>根——>右子树”,遇到一个结点,先去遍历左子树,如果该节点的根为空,才能递归回来进行打印。上面的是遍历思路,还有一种子问题思路。
2025-02-24 22:15:55
6054
28
原创 Java数据结构第十二期:走进二叉树的奇妙世界(一)
树是⼀种⾮线性的数据结构,它是由n(n>=0)个有限结点组成⼀个具有层次关系的集合。把它叫做 树是因为它看起来像⼀棵倒挂的树,也就是说它是根朝上,⽽叶朝下的。有⼀个特殊的结点,称为根结点,根结点没有前驱结点除根结点外,其余结点被分成M(M > 0)个互不相交的集合T1、T2、......、Tm,其中每⼀个集合Ti (1 <= i <= m) ⼜是⼀棵与树类似的⼦树。每棵⼦树的根结点有且只有⼀个前驱,可以有0个或多个后继树是递归定义的注意,在树型结构中,子树与子树之间不能有交集,否则就不是树型结构。
2025-02-20 14:57:55
1867
44
原创 数据结构(Java版)第十一期:栈和队列(二)
第二种解决方案是牺牲一个空间,当存储元素的时候,判断下一个位置是否为front,如果是,就不再存储了;第三种解决方案是标记,定义一个isFull方法,初始,先假设isFull是false,每次元素入队时,检查rear和front是否重合,如果重合设置rear==front,isFull方法置为true。模拟出栈,先判断哪个队列为空,另一个队列中前n-1个进入的元素进入到空队列中,最后一个元素再出队列。如下图所示,左边是队列,只能出10,而右边的栈只能出20,所以一个队列无法实现栈。
2025-02-19 22:04:21
11523
31
原创 优选算法的灵动之章:双指针专题(二)
但此时还有一种特殊情况,如果复写之后最后一个元素为零,那么dest就会越界,所以我们还要单独处理一下边界,只需把倒数第二个元素直接复写成零,然后cur向前移动一位,dest向前移动两位。我们先对三元子数组进行去重,当我们left或者是right移动一位所指向的值不变,那么就继续移动,此时我们需要注意指针是否会越界。首先我们依然想到的是先排序,然后暴力枚举,利用三层for循环来判断三数之和是否为零,由于题目不要求输出的顺序和三元组的顺序,所以我们需要对三元组进行去重的操作,那么此时的时间复杂度就是。
2025-02-17 16:14:41
1241
45
原创 优选算法的灵动之章:双指针专题(一)
首先,我们得明白如何计算容器的体积,容器的底就可以用两个数组的下标相减得到,容器的高根据木桶效应是数组中最小的元素。我们先选左右边界来作为容器,此时我们记容器体积为v1,如果left指针向右移动,则容器的底一定在减小,如果遇到比左边界小的数,那么高就会减小,如果遇到比左边界大的数,那么高不变。此时我们就可以把左边界干掉,left向右移动,得到新的容器体积v2,根据上面的逻辑,我们同理可以把右边界干掉。然后通过sum与target的比较,如果sum小于target,则左指针向右移动;那么此时的时间复杂度为。
2025-02-03 15:14:32
12305
57
原创 2024:在成长、创作与生活中找到星光
不知不觉,2024年已经过去,2025年已经悄然而至。今天是我加入优快云的第244天,回首这大半年的时光,仿佛一场充实而精彩的旅程,每一天都充满了新奇与成长。从最初对技术的懵懂探索,到如今能够对编程产生兴趣,优快云不仅是我获取知识的宝藏,更是我技术成长的见证者。有感而发,写下这篇2024年度总结2025年,我希望能在这个平台上继续深耕,不仅提升自己的技术能力,还能结识更多志同道合的朋友。我相信,只要保持学习的热情,未来的每一天都会比昨天更精彩。
2025-01-20 21:25:40
1670
63
原创 数据结构(Java版)第十期:栈和队列(一)
对于push方法,普通栈当中,所有数据都要放入,最小栈要对我们的普通栈第一次push进行维护。如果我们抛开这道题,获取栈中的最小元素,我们就可以去遍历这个栈来找出我们的最小元素。对于pop方法,如果弹出的数据不是最小栈的栈顶数据,则只需要弹出普通栈的栈顶数据就行,否则则要弹出最小栈的栈顶数据。Stack继承了Vector,Vector和ArrayList类似,都是动态的顺序表,不同的是 Vector是线程安全的,我们可以直接用数组来实现栈。入栈:栈的插⼊操作叫做进栈/压栈/⼊栈,⼊数据在栈顶。
2025-01-16 22:03:36
2142
63
原创 数据结构(Java版)第九期:LinkedList与链表(四)
从上面的图中可以看到LinkedList实现了众多的接口来帮助我们实现各种各样的功能,这里我们主要看List的接口。我们看一下LinkedList里面的源码。
2025-01-15 21:31:47
6971
46
原创 数据结构(Java版)第八期:LinkedList与链表(三)
题目中要求不能改变原来的数据顺序,也就是如上图所示。我们先定义一个cur引用去遍历这个链表,用每个结点的val值与x进行比较,然后利用尾插的方法把结点插入进两个链表中。我们先定义bs、be、as、ae四个引用来表示两个链表的头尾,在尾插的时候需要注意,利用ae.next = node;ae = node,记录下尾结点,保证ae永远指向最后一个结点,同时be.next=as,连接上两个链表。代码的大体框架已经写好,这时我们需要考虑一下当第一段插入第一个节点时,第一个节点既是头又是尾。
2025-01-13 15:45:08
8468
58
原创 数据结构(Java版)第七期:LinkedList与链表(二)
我们先定义一个傀儡结点newH,如上图所示,起初headA的val值比headB的val值小,那么headA就会指向下一个结点,再把0x23赋给我们的傀儡结点,再与headB的val值进行比较。加入我们输入了5个结点,要求我们返回第6个结点,那我们的fast就需要走5步,直接指向了空指针,我们可以再写一个if语句来返回-1。我们还需要再定义一个ListNode.tmp,当headA走到下一个结点时,tmp走到上一个结点,这样就能保证刚进行比较的两个结点中最小的结点值是新创建链表的最后一个结点。
2025-01-10 23:35:08
2242
35
原创 数据结构(Java版)第六期:LinkedList与链表(一)
与顺序表不同的是,链表的地址在物理上不连续,但在逻辑上是连续的。我们先来实现头插和尾插。但这种写法也有致命的缺点,如果说这个方法有返回值呢,head遍历完我们的链表之后,head引用变为了null,返回的值也会成一个null,如果我们再用ListCode创建一个cur变量,head引用保持不动,把head的引用赋值给cur,再让cur去遍历链表。接下来我们要通过代码来实现链表,我们就可以定义一个MySingleList类,链表当中有很多的节点,基于面向对象的思想,我们可以使用内部类来定义我们的节点。
2024-12-18 22:21:08
7371
103
原创 Java刷题训练第一期
算法分析:本题需要有两个注意的点,一个是matches方法需要进行匹配,另一个就是正则表达式的写法,也是本题的难点。算法分析:在Java当中,没有针对字符的输入,只能使用针对字符串的输入,然后再使用charAt方法取第一个元素。问题描述:请根据给出的正则表达式来验证邮箱格式是否合法,如果用户输入的格式合法则输出「邮箱格式合法」,否则输出「邮箱格式不合法」。输出描述:针对每组输入,输出为一行,一个整数,表示这一年这个月有多少天。输入描述:多组输入,一行有两个整数,分别表示年份和月份,用空格分隔。
2024-12-05 10:27:10
5869
75
原创 数据结构(Java版)第五期:ArrayList与顺序表(下)
但如果说,我们删除中间的某一个元素,当index==size时,尾插是可以的,但index>size的时候,就会出现异常。这个for循环结束的条件有两个,i==size或者是arr[i]==val时,但由于我们这个i是for循环里面的局部变量,我们可以把i改成index,并作用再for循环之外。下面我们进行对新增元素的实现,当我们插入一个新元素时,这个新元素之后的所有元素都要后移一个位置。其实呢,对于我们的顺序表和链表这样的结构来说,它们都是“有序的”,如果我们把原有的顺序改变了,就不是原来的结构了。
2024-11-24 23:21:13
7264
79
原创 数据结构(Java版)第四期:ArrayLIst和顺序表(上)
/第一种方式,创建ArrayList对象,构造空的顺序表//第二种方式其中ArrayList里面,也是实现了List的接口。也就是说,我们完全可以通过向上转型,把List引用指向ArrayList的实例。我们来看下面两段代码的,两个都是构造空的顺序表,二者有什么区别呢?第一个是创建了一个盒子,盒子里面为空,而第二个却连盒子都没有。//使用arrayList1复制一份,生成arrayList3//构造的同时,可以去指定初始容量。
2024-11-23 22:05:54
5542
59
原创 数据结构(Java版)第三期:线性表
多个元素,一个挨着一个。线性表的特点是每个元素都有一个前驱和一个后继。如果说一个表中出现分支,某个元素后面有两个后继,那么这个表就不是线性表了。线性表往下细分,分为两种实现方式:1.顺序表,也就是对经过封装的数组;2.链表。二者最本质的区别在于顺序表在内存空间上是连续的,而链表是不连续的,通过其它一些方式把前驱和后继联系起来。比如一本书中的一个故事,在第10页中没有讲完,在末尾就会印上“后续参见20页”。线性表是一个接口。定义一个线性表需要支持哪些功能,这些功能的具体实现,交给线性表的类来完成。
2024-11-23 14:35:37
725
31
原创 数据结构(Java版)第二期:包装类和泛型
描述的是使用泛型,创建泛型实例的时候,传入的参数(类型实参)需要满足什么条件。方法限定符 <类型形参列表> 返回值类型 方法名称{
2024-11-22 23:06:41
4158
57
原创 数据结构(Java版)第一期:时间复杂度和空间复杂度
什么是数据结构呢?相信很多老铁尤其是非计算机专业的老铁还是第一次听说这个词。通俗地说,数据结构就是在内存当中对我们的数据进行一个管理和建立数据见关系,我们熟知的内存条(如下图所示)就是存储数据的介质,我们对数据的管理就是存储在内存条上的。计算机这个学科最重要的是做软件开发,软件可以帮助我们实现各种功能,比如我们微信好友列表里面,表面上就是一堆姓名的数据,透过计算机我们看到的只是01010,而这些数据就存在内存条上。
2024-11-21 23:31:43
2734
43
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人