- 博客(222)
- 收藏
- 关注
原创 力扣543.二叉树的直径(java)(迭代法 and 左右根后序遍历迭代法)
在求一个结点的深度时(max(left,right) + 1) ,顺便求出来该结点的直径。二次弹出,模拟的是 : 左右根后序遍历,核心是先处理左右子树的计算,再处理根结点。栈的存储的是 : Object[] 用于放 结点 + 结点访问情况(是否访问过)当然也可以用哈希表来存储。Map<TreeNode, boolean>哈希表存储结点深度,是为了获取左右子树结点的深度,用于计算。直径:一个结点的,左子树最大深度 + 右子树最大深度。最大直径: 所有结点中,的最大的那个。
2025-10-24 00:37:46
282
原创 力扣101.对称二叉树(java)
2. 左子树的左子树与 右子树的右子树 是否同时与 左子树的右子树与 右子树的左子树 均为对称。(对称:左子树与右子树是否都为空,两值是否都为空, 不对称:只有一值为空)这里的dfs,是双向深入的dfs。因为需要两子树进行比较。1. 左子树 与 右子树是否堆成。类似dfs,只是逐层处理。
2025-10-23 21:05:46
164
原创 力扣226.翻转二叉树(java)
直接正常入栈就行,把栈顶结点直接交换左右子树就行。也就是,从根节点开始,交换左右子树,然后左节点,最后右结点。
2025-10-23 03:35:44
244
原创 计网.第三章数据链路层笔记②
全球单播 MAC 地址之所以会关联个人信息,核心原因是它的唯一性和硬件绑定特性1. MAC 地址是设备的 “永久身份证”全球单播 MAC 地址由厂商在生产时固化到网卡中,一台设备对应一个唯一 MAC 地址(类似身份证号)。这种 “唯一性” 让它成为识别设备的核心标识。2. 很多场景下,MAC 地址会和个人信息 “绑定”运营商 / 网络服务端:办宽带时,你的光猫 MAC 地址会和 “宽带账号、家庭地址” 绑定;连公共 WiFi 时,热点会记录 “你的 MAC 地址 + 连接时间、位置”。
2025-10-20 13:05:05
600
原创 力扣94.二叉树的中序遍历(递归and迭代法)(java)
但是找到最左边怎么回去呢?如果我在沿途找的时候,把过程中的结点存放起来,而栈最合适。因为如果想要实现左中右的遍历效果(也就是中序遍历效果),就需要先找到最左边的,遍历结果就存放在动态数组中,(ArrayList)迭代法就是模拟递归栈。
2025-10-18 20:20:52
233
原创 计网.第三章数据链路层笔记①
最终接收端计算出的余数不为0,接收端能发现出现差错。接收端接收数据 : 11010110 00 1110 除数 :10011余数不为0000 所以 能发现差错。
2025-10-17 09:37:12
799
1
原创 力扣146.LRU缓存(哈希表缓存.映射+双向链表数据结构手搓.维护使用状况顺序)(java)
= 需要写 双向链表头插法addToHead 方法 and 双向链表删除尾结点方法 removeTail and 双向链表删除某个结点方法 removeNode。总的来说,就是 通过哈希表 映射到 双向链表某个结点。但是需要考虑到使用状况顺序问题(近期操作时间先后顺序排序),使用双向链表,存储数据。LRU缓存的put方法 -> 从哈希表中获取 对应结点 + 数据插入或修改。于是 哈希表中, key -> DLinkedNode(双向链表的结点)数据插入也就是 创建结点,插入结点到链表。
2025-10-16 02:49:32
455
原创 力扣23合并k个升序链表(分治法和暴力法)(java)
其实就是跟上一个文章的归并排序一样。只是把合并元素,从一个结点变成了一个链表。2.链表1和链表2进行合并,合并后将链表1更新为合并后链表,继续合并。1.创建一个有头结点的链表做合并后链表。总的来说就是两两合并。
2025-10-14 09:06:29
281
原创 力扣148排序链表(java)归并排序
通过让左边链表链表尾 prev.next = null;不断缩小规模,缩到只有一个结点,然后不断回调。通过比大小,排序,来合并左右子链表。
2025-10-14 08:01:35
301
原创 力扣138随机链表复制(最本质问题解决:random指针)
一次遍历,创建新结点,去赋值val和next值给到新结点,就会出现无法赋值random的情况,因为出现了问题1,二次遍历赋值random会发现,出现问题2,ramdom是指向原引用的。random第一次遍历肯定无法赋值,random是指向原结点的,新链表没建立就不存在random指针,random指针是整条链表的角度来看的。通过给结点绑定映射关系,就能知道哪个结点对应哪个结点,这样就算random引用了原结点,依旧可以通过映射关系来获取。a->a的复制结点A->b->B->c->C。
2025-10-12 10:41:44
423
原创 每日一题:不修改数组找出重复的数字
抽屉原理: 如果把十个苹果放到九个抽屉就会多出一个,这一个再放进去就会出现某抽屉至少放2个。利用这个原理,对区间进行划分,算左区间有多少个苹果,苹果数是否大于抽屉数,右区间收缩,不断如此。
2025-06-15 13:19:47
183
原创 javaSE.Collections工具类
Collections.max->求list最大值,但是要Integer这样的可比较的。equals类的String类比较重写了equals方法,比较的是值相等。值相同,对象不同(引用不同)的hash👇。JDK为我们准备的专用于集合的工具类。没有重写哈希和equals👇。这跟集合的底层封装有关。👇这是通过向导一键生成的。
2025-05-21 09:15:08
157
原创 javaSE.Stream流
流相当于流水线,进入流水线stream() 开始一系列加工,最后返回.collect(Collectors.to-----)注意,不能认为collect 前面的语句是依次执行,它只是设定程序。最后一步进行加工处理得到产品。通过stream可以完成所有数字的求和👇。快速处理字符串,不需要一个个遍历来搞👇。生成统计实例进行快速统计。
2025-05-20 07:45:06
126
原创 javaSE.Map
entrySet()获取map中所有的键值对的集合,每个键值对是一个entry对象,forEach遍历集合遍历每个entry对象。左边值映射着右边的值,左边相当于钥匙,开到右边的门获取得到信息。Map存储映射关系。第一次,小明覆盖掉null,返回null打印。是否存在该key👇containsKey()维持插入顺序👇LinkedHashMap。第二次,小红覆盖掉小明,返回小明打印。第三次,小刚覆盖掉小红,返回小红打印。HashMap的顺序👇。
2025-05-18 20:09:26
183
原创 javaSE.Queue&Deque
Deque<E>继承自Queue<E> 继承自Collection<E>继承自Iterator<T>只是保证出队顺序按照优先级,并不是说存储顺序是这样。两端都可以入队出队,既可以实现队列,也可以实现栈。优先队列PriorityQueue👇 →”小根堆“底层是大根堆小根堆实现的,存储也是。Deque当作栈使用👇。queue入队出队👇。
2025-05-15 16:48:30
228
原创 javaSE.迭代器
摆烂一段时间,终于开始继续学了。哎,学东西学一半中断,不坚持下去,会亏很多东西。对于整个人的磁场也是。尽量不要半途而废吧,任何东西都是。得益于literable提供的迭代器生成方法,实际上只要是实现了迭代器接口的类(我们自己写的都行),都可以使用foreach语法。👇forEach及其方法引用。用了之后要重新创建👇。
2025-05-15 16:16:03
180
原创 javaSE.走进集合类
集合表示一组对象,每一个对象我们都可以称其为元素。不同的集合有不同的性质,比如一些允许重复的元素,而另一些集合则不允许,一些集合是有序的,而其他则是无序的。集合类其实就是为了更好地组织、管理和操作我们的数据而存在的,包括列表、集合、队列、映射等数据结构。2.数组可以存放基本数据类型,但集合只能存放对象。1.数组的大小是固定的,集合的大小是可变的。1.他们都是容器,都能容纳一组元素。
2025-04-23 18:19:31
126
原创 javaSE.二叉查找树和平衡二叉树
如果是递增的情况👇这样插入就是其实就是一个单链表,查找效率退化了。二叉查找树只有在理想的情况下👇👇,查找效率才是最高的,因为可能会有一边倒👆的情况。4 2 6 1 3 5 7👇这样按顺序插入👇↗74 → 6 → 5↘ 2 →3↘1。
2025-04-21 17:58:51
217
原创 javaSE.二叉树的遍历
👇👇👇根->左->右左根右点三行断电👇点击右上角调试👇点击F9观察控制台和线程👇👇这里是运行的行数,第几行代码的意思👇当前行数变量情况上面断电多加一条if语句👆更清晰。其实就是递归流程以及其中变量情况队列👉javaSE.队列-优快云博客
2025-04-20 22:17:50
305
原创 javaSE.判空包装类
对这种可能👆为空的情况处理,如果为空,那么就返回另一种备选方案:👇orElse。map可以将String处理为Integer类型 然后get 获取对象👇。get方法可以获取被包装的对象引用,但是如果为空的话,会抛出异常。使用map来进行映射,将当前类型转换为其他类型,或者是进行处理。判空包装类Optional,这个类可以很有效的处理空指针问题。包装之后,我们再获取时可以优雅地处理为空的情况:👇。Optional类可以更加优雅地处理这种问题👇👇。还可以将包装类型转换为另一种类型👇。
2025-04-19 20:10:58
199
原创 javaSE.四大函数式接口
函数式接口就是JDK1.8专门为我们提供好的用于Lambda表达式的接口,这些接口都可以直接使用Lambada表达式。
2025-04-19 15:54:51
374
原创 javaSE.类型擦除机制
泛型是如何实现的,程序编译之后的样子是什么样的?一个泛型类型编译之后实际上会直接使用默认的类型👇我们给类型变量设定了上界,那么从默认类型变成上界定义的类型👇👇👇编译之后:👇泛型仅仅在编译阶段进行类型检查,当程序在运行时,并不会真的去检查对应类型,所以哪怕我们不去指定类型也可以直接使用👇使用的时原始上界Number👇可以传入Number, 11.1👇若是上界Object👇👇默认为Object👇可传入String👇在指定类型时,编译才会进行检查👇否则就是默认原始类型👆。
2025-04-18 12:55:20
300
原创 javaSE.泛型界限
extends Number, 不能确定是Number的类及其哪个子类,这样子去setValue,无法确定是否是这个类型,虽然他确实是Integer👇👇。也可以创建对象这样设置,上界必须是Integer👇。限定下界就没有上述的问题👆👇👇👇下界的话。上界Number获取的是Number👇。继承自Number类的就符合要求👇。这里是隐式类型转换为Object👇。同理Integer为上界👇👇👇。强转子类Integer👇。Number为上界👇👇👇。快速获取类型var👇。
2025-04-17 19:24:12
189
原创 javaSE.泛型方法
当某个方法(静态方法或者是成员方法)需要接受的参数类型并不确定时,我们也可以使用泛型来表示👇。返回值小于0,说明第一个参数排在第二个参数前面。传入空串,返回空串,字符串类型。在Arrays中的泛型方法👇👇👇。替换成lambda表达式👇。
2025-04-16 20:51:52
129
原创 javaSE.泛型与多态
当子类实现此接口时,我们可以选择在实现类明确泛型类型,或是继续使用此泛型让具体创建的对象来确定类型👇。不只是类,包括接口,抽象类,都是支持泛型的:👇。
2025-04-16 19:49:54
144
原创 javaSE.走进泛型. 泛型类
为了统计学生成绩,要求设计一个Score对象,包括课程名称、课程号、课程成绩,但是成绩分为两种,一种是以优秀、良好、合格来作为结果,还有一种就是60.0,75.5,92.5这样的数字分数,可能高等数学这门课是以数字成绩进行结算,而计算机网络实验这门课是以等级进行结算,这两种分数类型都有可能出现,那么现在改如何去设计这样的一个Score类呢?现在问题就是,成绩可能是String类型,也可能是Integer类型,如何才能很好的去存可能出现的两种类型呢?
2025-04-16 18:59:16
349
原创 javaSE.数组工具类
Arrays.binarySearch 数组中有的元素,并且是有序数组。判断二位数组内容是否一样,Arrays.deepEquals(a,b)判断一位数组内容是否一样, Arrays.equals(a,b)有序数组(从小到大),使用二分搜索快速找到对应元素在哪个位置。打印二位数组,打印出来的是引用,二维数组里边存的是引用。.toString(arr) 打印。核心:二位数组里边存的是引用。
2025-04-16 16:05:43
159
原创 javaSE.数学工具类
生成一个随机数,需要使用Random类来生成(这个类是java.util包下的,需要手动导入)👇。按理说,sinPI = 0;这是精度导致的,所以实际上结果就是0.👇。还有一些比较特殊的计算👇。
2025-04-16 08:43:37
130
原创 javaSE.抛出异常
当程序没有按照我们理想的样子运行而出现异常时(默认会交给jvm来处理,jvm发现任何异常都会立即终止程序运行,并在控制台打印栈追踪信息)现在我们希望能够自己处理出现的问题,让程序运行下去,就需要对异常进行捕获。如果某个方法明确指出会抛出哪些异常,除非抛出的异常是一个运行时异常,否则我们必须要使用try-catch语句块进行异常的捕获,不然无法通过编译。catch中捕获的类型只能时Throwable的子类,也就是说要么是抛出的异常,要么是错误,不能是其他类型。即使出现了异常并未捕获也会执行finally👇。
2025-04-14 18:31:37
234
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅