- 博客(47)
- 收藏
- 关注
原创 Day 18
其实就是对于树中的每个节点,计算它的值加上树中所有大于该节点值的节点的值.但是保证搜索二叉树的定义,那就是左子树的节点值必须小于节点的值,右子树的节点值必须大于节点的值.那我们就从右子树入手,注意修剪的时候要考虑到全部的节点,即搜到到限定区间小于左值或者大于右值时还需要检查当前不符合区间大小节点的右子树/左子树,不能直接返回null.给了升序数组其实一开始想的也是第一个参数是左子树最左边的值,然后去选中间节点做切割.剪去节点只需要在判断当前节点左/右子树后将root的左/右节点更新即可.
2024-11-21 11:03:44
396
原创 Day18
首先找到要删除的节点(如果是叶子节点的话删除不影响)只要不是叶子节点删除可以把右子树中的最小节点(即右子树的最左侧节点)或左子树中的最大节点(即左子树的最右侧节点)上移占位.已知左子树的值都比根节点小,右子树的值都比根节点大(每层都符合该规律)但是由于不知道p、q的值哪个比根节点大所以需要进行比较.题目又说任意地方插入,我们选插入叶子节点,只要遍历当前节点为空就说明扎到了向上返回即可.找目标删除的节点也可以用相同的方法缩小判断区间.2.能找到但匹配值的为叶子节点。3.能找到匹配值不为叶子节点但。
2024-11-21 11:01:56
329
原创 Day 16
根据之前分析的规律,我们利用后序遍历确定root.value,然后对应在中序遍历中定位到root位置(利用index)然后回溯到中序遍历切割出左子树那么在后序遍历中剩余的部分就是右子树.首先还是想到按照前序遍历的方式,递归遍历.由于根节点是一定要选中的,(null另算)那我们遍历子节点做差判断最后是否等于0即可.根据画图规律可得 后续遍历中root位置出现在最后一个位置,再结合中序遍历可以得出9为左子树,15、20、7为右子树.又假设二叉树中至少有一个节点,就已经列举出一种特殊需要判断的情况了.
2024-11-13 09:34:48
717
原创 Day17
首先想到的是在之前深度的基础上,遍历计数节点,利用完全二叉树的性质,左子树的高度一定是大于等于右子树的高度,所以我们遍历只需要判断左子树就行.按照我们上一题的思路,针对左子树只有一个节点,但右子树有至少一层分支的基础上,最小深度就不会是1了.但是其实这里我们可以选择后序遍历,根节点的高度就是树的深度.自己画图分析一下有哪些情况,还是之前讲的特殊情况优先考虑.和上题的思路基本一致,但是注意不是把最大值改成最小值.
2024-11-13 09:32:09
347
原创 yub‘s Algorithmic Adventures_Day15
其实最开始想到的是暴力的遍历循环,逐个判断计数排列,剔除出现频率最小的元素.想用set但是不匹配统计频率的要求.就需要Set和Lsit结合.最后发现还是离不开心爱的map啊(大顶堆秒了)对于统计元素出现的频率,这一类问题可以用map来进行统计(key和value无敌)key存放元素,value存放出现的频率.提供 O(1) 的时间复杂度来访问元素,这在需要频繁读取结果时非常高效。可以根据需要动态调整大小,适合在不知道最终节点数目的情况下使用。的 API 设计简单,提供了方便的方法(如。
2024-11-01 19:31:18
438
1
原创 yub‘s Algorithm exercise Day14
根据样例分析发现规律:假设数组nums长度为n,那么滑动窗口的移动次数【也可以叫做移动范围吧】为n-k+1,所以我们结果集res的长度就是n-k+1.最开始的思路就是用栈解决,非运算符号的先入栈,遇到运算符再出栈对运算符进行判断之后进行相应的运算最后出栈即可.】实现(不用暴力是因为时间复杂度肉眼可见的高)那么在这里是否也可以用呢?为了保证运算顺序,运算都是num2对num1操作(因为先进后出)看到题目hard不要着急,尝试分析,最开始接触的滑动窗口也是用。(双端队列)在 Java 中的典型实现是基于。
2024-10-31 00:50:24
486
原创 yub‘s Algorithm exercise Day13
其实最开始思考用队列实现栈把末尾入队的元素放到队头即可 但是没有对知识点进行清晰的掌握 下附妙招.栈和队列都有peek() 可以称之为“瞄一眼”只是看一下当前栈顶/队头元素是什么.由于队列是先进先出 想要模拟栈第二个队列就是起到备份的作用.队列中的poll()在某种层面上就等效于pop()了.队列是先进先出 栈先进后出【两者都能存储元素】先用栈1存储所有元素 再逐个pop到栈2中。栈中的pop()直接返回栈顶元素(出栈)再来看peek()和poll().首先理清楚栈和队列的异同.实现中,因为使用的是。
2024-10-26 00:32:57
1004
原创 yub‘s Algorithmic Adventures_Day12
2.在使用 StringBuffer 类时,每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,所以如果需要对字符串进行修改推荐使用 StringBuffer。首先创建一个字符数组用于存储遍历的下标位置用于筛选【其实类似双指针判断 此时尾指针的判断 避免越界】判断区间为[数组长度-1,起始位置 + k - 1]倒序遍历字符串,记录左右边界i,j,找到空格删除,挨个遍历.最后蒋单词拼接返回字符串.关键点在于我们要找对反转思路,2k是一个区间,没达到条件和达到条件之后怎么处理.
2024-10-23 21:45:14
372
原创 yub‘s Algorithmic Adventures_Day11
其实最开始学C语言的时候,也遇到过类似题目.当时自以为的投机取巧无非只是倒序打印而不是逆置元素.(hh 果然小白都会这样 当然也有更聪明的小懒狗直接用库函数 【及其不推荐】如果按照三数之和的去重条件会不符合预期【因为三数之和求解的target是0 元素都大于0 那三数加和自然不会为0】当数组首元素大于0并且i下标位置的value大于target的时候就可以直接pass.去重b的逻辑从i+1位置开始【其实相当于left】 和去重a一样的逻辑。去重a的逻辑相同 为了避免[1,1,2]这种情况 判断为。
2024-10-17 23:34:36
480
原创 yub‘s Algorithmic Adventures_Day10
用双指针进行判断【必须是数组排好序】,i在数组起始位置,left在i+1位置,right在数组末尾.i和right先不动,left依次向后遍历,如果三者相加大于0,right向前移动.三折相加小于0,left往后移动.根据提供的示例发现只是三元组不能重复但是组内元素可以相同如[0,0,0].这种情况在去重的时候要考虑进去.避免对{-2,-2,4}这样的数据筛查遗漏.最先想的是两两分组,用数组做,然后又想到用哈希map映射,但是题目限制了去重,不是很好操作.
2024-10-16 10:03:40
223
原创 yub‘s Algorithmic Adventures_Day9
首先看到四数加和,很容易想到两两分组遍历分别求和.利用map中key和value分别存储两个数组元素之和以及出现的次数(value)最后利用两两打足求和之后加法原则a+b(A)+ c+d(B)= 0,0 - B = A,如果A在map中出现过,就用定义的计数器count吧map中key对应的value统计出来最后返回count即可.【出现过几次就有几组】我们需要一个集合存储我们遍历的元素,对应的key值和value值分别存放元素和下标.(HasMap)分别从i位置和j(i+1)位置开始相加遍历判断.
2024-10-14 11:06:54
525
原创 多线程篇九
在加锁之前,总假设数据从一开始就容易被修改,每次拿数据的时候就会加锁.想拿到这个数据只能等待阻塞拿到锁.(在加锁之前预估出现锁冲突的概率很大,加锁的时候会做更多的工作防止意外,此时加锁的速度可能更慢,但是整个过程中更不容易出现其他问题)所以读写锁因此⽽产⽣.有A、B、C三个线程.A先尝试获取锁然后获取成功,B此时开始尝试获取锁,获取失败阻塞等待,然后C也尝试获取锁,仍然阻塞等待.跟上述情况相反.第二次加锁的时候会阻塞等待直到第一个锁释放,才会获取到第二个锁.但是该线程摆了什么也不想干,此时就会死锁.
2024-10-13 15:46:31
679
原创 yub‘s Algorithmic Adventures_Day8
起初分析的时候被卡在了循环条件处【😓】,首先得不是1然后不满足快乐数条件最后不被包含在Hashset中.【是的没错是高贵的Hashset(bushi)】首先想到合并两个数组,遍历找重复项存储到新的数组中但其实用HashSet是更加方便的,【HashSet不存在重复数据】**注意:使用数组做哈希表的题目都限制了大小 例如只有小写字母或者数值大小在【0-1000】内 **:将集合转换为流对象,便于对集合进行链式操作.mapToInt(x -> x)类型(自动拆箱).toArray():将流中的元素收集为一个。
2024-10-12 00:47:49
448
原创 yub‘s Algorithmic Adventures_Day7
( 解析: 双指针都走过 a 步,然后在环内绕圈直到重合,重合时 fast 比 slow 多走 环的长度整数倍 )如果链表存在环,则双指针一定会相遇。因为每走 1 轮,fast 与 slow 的间距 +1,fast 一定会追上 slow。将以上两式相减得到 f=2nb,s=nb,即 fast 和 slow 指针分别走了 2n,n 个环的周长。fast指针始终比slow指针多走一步 在有环的情况下必定会相遇 【每轮循环fast都靠近slow一步】fast 走的步数是 slow 步数的 2 倍,即 f=2s;
2024-10-09 00:41:27
460
原创 yub‘s Algorithm Adventure Day6
既然是计算相交节点,那么我们就会有公共节点.这里我们称之为node【是的如此普通】看到描述很直接的想到双指针,但是看到题解之后被K佬的神级理解折服,太妙了!双指针加虚拟头节点.
2024-10-06 00:42:21
275
原创 yub‘s Algorithmic Adventures_Day5
我们想实现的是1和2交换,3和 4交换,此时很难不想到借用中间变量实现,不用递归实现【每次单独处理头节点】更优雅.与数组不同,链表没必要定义新的链表进行存储【对内存空间的浪费】判断next.next不为空是为了防止空指针异常。和双指针法是一样的逻辑【升华版】注意5后面是空指针就不用交换。直接改变next指针即可.
2024-10-05 00:07:12
274
原创 yub‘s Algorithmic exercise Day4
链表更适合,因为它可以高效地插入和删除元素,时间复杂度为 O(1)O(1)O(1)(假设已找到插入或删除位置)。看到题目最第一反应就是常规解法,遍历链表找到target直接进行删除操作.【目标是头节点和不是头节点两种情况】(其实还是想有更优雅的解法 不用单独处理移除头节点的情况)链表的查找需要从头往后一个个查找【时间复杂度为O(n)】,但是数组查找只需要访问对应元素下标即可【时间复杂度为O(1)】.:数组是更好的选择,因为通过索引访问的时间复杂度是 O(1),链表则需要遍历.2.在链表最前面插入节点.
2024-10-03 23:16:45
464
原创 yub‘s Algorithmic Adventures_Day3
其实也可以理解成给入队的队列一个给定的大小变成窗口,先入队元素,然后和target进行比较,大于等于target就出队先进的元素,再进新元素并且标记好原来大于等于target的数组长度.如果循环中的标记位在起始位置,起始位置和终止位置都需要移动一遍和暴力解法无差别,所以我们的标记位一定是终止位.根据题意平方之后的数一定在数组的两端.两个指针一首一尾,从后往前更新数组.一个数列中的元素从左到右依次不减,或者说不降序排列.2.双指针(找准循环不变量中的不变量).3.求连续子数组的总和可用滑动窗口解决.
2024-10-02 22:24:58
412
原创 多线程篇八
顾名思义,线程池是一个存放了很多线程的池子.既然有很多线程,那一定很方便调用对吧,有很多线程那大家一定喜欢一起玩吧(并发).线程池是一种并发编程中常用的技术,用于管理和重用线程.线程池由线程池管理器、工作队列和线程池中的线程构成.
2024-09-29 01:55:21
972
原创 Exploration of how2heap
由于 free 的过程会对 free list 做检查,我们不能连续两次 free 同一个 chunk,所以这里在两次 free 之间,增加了一次对其他 chunk 的 free 过程,从而绕过了检查顺利执行,然后再 malloc 三次,就在同一个地址 malloc 了两次,也就有了两个指向同一块内存区域的指针。这个例子没有演示攻击效果,但对glibc的分配机制进行了演示.若有一个空闲堆块够大,malloc将选择它进行利用.如果存在UAF情况可进行利用,首先申请两个较大的chunk(上图中的1和2)
2024-09-25 15:04:25
658
原创 yub‘s Algorithmic Adventures_Day
2.快慢指针.快指针遍历进行筛选,慢指针对应常见存储的数组.找到目标vaule后fast和slow指针拉开距离开始遍历维护更新.【时间复杂度O(n) 空间复杂度O(1)】1.常规遍历数组,比较vaule值是否相等,若不相等往前拷贝覆盖即可,相等跳过,更新下标(可以理解为数组长度减少).【时间复杂度O(n) 空间复杂度O(1)】如笔者理解有误,欢迎指正交流⭐。
2024-09-25 14:59:43
241
原创 yub‘s Algorithmic Adventures_Day1
同样的条件但是right指针指向nums.length,对应的left == right没有意义.所以判断条件是left < right.如果target在nums[mid]左边的话,把left赋值为mid+1,但是反过来。left指针是0.right是5,这个时候left == right是有效的,结束条件也就是left<=right,再根据mid位置进行判断,target是再mid左边还是右边或者是幸运的查找到目标位置.找到mid,根据逻辑大小缩小范围比较.如理解有误欢迎指正交流~
2024-09-23 16:48:40
629
原创 多线程篇七
听到定时器,首先想到的是“闹钟”.到一个设置好的时间之后就执行某个指定好的代码.(在实际开发中非常常用,如网络通信【邮件发送】)你在抢演唱会门票,已经到了支付页面,但是网突然崩了,页面显示让你等待,这下怎么办!!对于我们来说是不能无限的等待下去的,我们需要一个等待期限最好是尽快处理,此处的等待时间就通过定时器来实现了.
2024-09-21 11:36:29
668
原创 多线程篇六
单例模式是最常见的设计模式顾名思义,单例模式指的就是单个实例的模式.(针对某些类只能使用一个对象的场景【如MySQL、JDBC、DataSource】)阻塞队列是一种特殊的队列,遵守”先进先出”原则.【典型的生产者消费者模型】
2024-09-18 11:28:27
2219
原创 多线程篇五——wait和notify
2.使用wait()时没有设置最大等待时间,而sleep()是在知道最大时限的情况下使用(通过异常唤醒,说明程序应该是出现特殊情况了).调用notify()方法后不会立即释放对象锁,要等到执行notify()方法的线程将程序执行完之后【退出同步代码块】才会释放对象锁.notify()要在同步方法或同步块中调用.它会通知可能等待该对象对象锁的其他线程,使得它们重新获取对象锁.1.wait()可通过notify()唤醒,sleep()通过Interrupt()唤醒。wait()方法的大任(唤醒等待的线程).
2024-09-12 01:16:23
763
原创 CSAPP LAB
丑话说在前头 不做不知道 一做吓一跳 是真的什么都不知道捏~yub刚开始想整tmux玩https://www.jikecloud.net/supports/docs/tmux-intro/ 发现字体颜色太暗了眼睛要麻了(懒得调)最后还是去了terminal。
2024-09-10 00:23:58
874
原创 多线程篇四——volatile关键字
由此我们可得读内存比读硬盘快,读寄存器比读内存快,但是CPU一旦涉及读/写内存速率很低.此时我们聪明得编译器就会帮忙了(虽然有时候会帮倒忙) 编译器可能会对代码做出优化,减少读内存的次数。由于修改flg是t2线程非t1线程本身,编译器没有正确的判定(提高效率不保证逻辑不变哈)以为flg未被修改就直接启动优化了,t1感受不到修改过后的flg的内存变化。" 按理来说修改flg的值不为0的时候会输出"game over!的操作,这样就出现了最开头介绍的小聪明编译器.big 胆就水灵灵优化上了😀。
2024-09-10 00:17:04
571
原创 RE算法学习
运算符是按位与运算符,用于对两个数的二进制表示进行位级别的与操作。当其中一个操作数是 31(二进制表示为 00011111)时,它可以用来保留一个整数的低 5 位(或者说对 32 取模).可以发现sub_4010A0函数中GetDlgItemText对应读入Name和Serial Number.运算符是取模运算符,用于计算一个数除以另一个数的余数,它适用于任何整数。因为 31 的二进制表示只有最低的 5 位为 1,所以对非负整数进行。的结果相当于对该整数进行。密文:128bits。
2024-09-06 14:33:16
459
原创 多线程篇三
想对线程安全做一个具体清晰的解释很困难,为什么这么说?当然是具体情况具体分析.(就像很多人都喜欢吃面条 有的人喜欢吃炸酱 有的人喜欢吃刀削【其他不具体拓展 因为饿了w】可以具体细分)但是!我们可以这样认为如果多线程环境下代码运行的结果是符合我们预期的 ,即使在单线程环境应得的结果,则说明这个线程是安全的.比如我(线程A)登录一个手游(一段代码),在我未退出游戏时,我们的游戏好友(线程B)也可以登录游戏组队打本.(打断我在游戏中的隐私)这就是不具备原子性听起来是不是和抢占式很像?真聪明hh。
2024-09-06 13:40:32
926
原创 多线程篇二
使用jconsole观察,t1线程为TIMED_WAITING状态(排队等工作 sleep引起),t2线程为BLOCKED状态(由于t1未执行完 产生锁竞争)我们知道一个线程在完成它的工作后才能进行自己的下一步工作,但在期间想穿插别的工作进来就需要控制线程结束的顺序来实现.1.如果线程正在工作中,此时调用thread线程就会阻塞,一直阻塞到thread线程执行结束位置.WAITING 线程在无限等待唤醒。2.如果thread线程已经执行结束了,此时调用join线程,就会直接返回,不会涉及阻塞.
2024-08-16 21:01:03
1710
原创 操作系统复习提纲(2022慕课版)
由程序段、相关的数据段和PCB块三部分构成进程(实体)进程是程序的一次执行进程是一个程序及其数据在处理机上顺序执行所发生的活动进程是具有独立功能的程序在一个数据集合上运行的过程 是系统进行资源分配和调度的一个基本单位假脱机技术 外围设备同时联机操作作用:缓和CPU的高速性与I/O设备低速引入组成:输入井和输出井输入缓冲区和输出缓冲区输入程序和输出程序(模拟脱机操作 包括读和写过程)请求队列操作6、采用缓冲技术的主要目的 (P233)缓和CPU和I/O设备间速度不匹配的矛盾。
2024-08-12 15:31:37
1678
2
原创 Java多线程
比如我去汉堡店打工,负责做美味蟹黄堡,客人太多,Boss又招新人负责分担相同的工作,Boss电脑被黑了,员工里只有我掌握了相关技术,那就只有我能解决问题.(即实现并发【兵分两路 充分利用多核CPU】 Java中的“并发”多指并行+并发 区别操作系统中的宏观和微观理解)(这个id式Java给这个线程分配的 不是系统api提供的线程id 更不是pcb中的id)当进行复杂任务时,会创建多个线程进行问题处理,不同线程有不同的小任务排队执行.debug启动有一个专门的窗口查看方法的调用栈,可以查看所有线程的信息.
2024-08-12 15:07:35
950
原创 洛谷菜鸟记录
1、next()方法在遇到有效字符前所遇到的空格、tab键、enter键都不能当作结束符,next()方法会自动将其去掉,只有当next()方法遇到有效字符之后,next()方法才将其后输入的空格键、Tab键或Enter键等视为分隔符或结束符,所以next()不能得到带有空格的字符串,只能得到部分字符串(空格前面的)。有可能在某个月的月初,津津手中的钱加上这个月妈妈给的钱,不够这个月的原定预算。每个月的月初妈妈给津津 300300 元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同。
2024-08-12 00:43:53
403
原创 The Missing Semester of Your CS Education
前尝试打开 brightness 文件并写入,但是系统拒绝了 shell 的操作因为此时 shell 不是根用户。猜想正确工作的原因是“参数”和“输入”的区别(未经验证或查找资料):cat 程序将输入打印在屏幕上,是输入重定向,意思也是将文件中的内容作为程序的输入,而不是将文件的内容作为参数,因此二者效果相同。当有权限修改文件但无法修改文件所在目录时,即无法删除文件,只可将其制空。是通过 shell 执行的,而不是被各个程序单独执行。是参数,将该文件的内容作为输入;权限在运行,因此操作可以进行。
2024-08-12 00:42:23
542
原创 ret2csu
gadgets是一段对寄存器进行操作的汇编指令,比如pop ebp;pop eax;每一条指令对应着一段地址将这些gadgets部署到栈中,__ sp指针指向某gadget时发现对应地址中是一条指令而不是一条数据后就会将该地址弹给 __ ip指针, __ip指针会执行该地址中存放的汇编指令,完成对寄存器的操作.(某一gadget-0x1a得到上一gadget)
2024-08-12 00:41:40
906
原创 【BUUCTF】
【BUUCTF】后门函数直接打通即得flag【64位system函数栈对齐(timeout问题)但其实Got EOF while reading in interactive😓】关键词:8bite 16进一 末尾对齐(可看成循环:0 8)【之后详细补充】下附两种版本exp(😜)可见函数从0x401186开始,但timeout【64位栈对齐+1(但不一定保证+1后下一地址一定为栈指令如{move 好几字节})】可以看到和第二题思路一致(“/bin/sh"换成"cat flag.txt")
2024-08-12 00:39:50
695
原创 数据结构碎片
操作结果:构造一个空链表初始条件:线性表L已经存在操作结果:销毁线性表L初始条件:线性表L已经存在操作结果:将线性表L重置为空表初始条件:线性表已经存在操作结果:若L为空返回TRUE,否则返回FALSE初始条件:线性表已经存在操作结果:返回L中数据元素个数初始条件:线性表L已经存在,1
2024-08-10 10:18:05
705
1
原创 NepCTF 2023
有沙盒,只能使用open,read,write函数. goto 0009中0009是return ALLOW说明允许执行. 注意是call syscall函数而不是直接syscall 所以寄存器会有偏移。根据提示A同学 开始bing 结果 竟然 看过 (我有罪)五子棋 不会写脚本干下吧hh(求助chat也不是不行)不是我说 是真不会但是跟着复现cve 从中学到了很多。(其实可以做misc)题目提示flag在环境变量中。题目提示classic pwn。求助chat因为不会用。
2024-08-10 10:14:35
464
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅