- 博客(97)
- 收藏
- 关注
原创 算法(二十一)
说明此时这个位置的元素需要在 left + 1 的位置上,因此交换 left + 1 与 cur 位置的元素,并且让 left++ (指向 0 序列的右边界),cur++ (为什么可以 ++ 呢,是因为 left + 1 位置要么是 0 ,要么是 cur ,交换完毕之后,这个位置的值已经符合我们的要求,因此 cur++ );当遇到 'r' 'o' 'a' 'k' 这四个字符的时候,我们要去看看每⼀个字符对应的前驱字符,当遇到 'c' 这个字符的时候,我们去看看 'k' 这个字符有没有⻘蛙叫出来。
2025-04-08 17:30:00
291
原创 算法(二十)
第⼆⾏、第三⾏除了第⼀个数取值为⾏ 数,每组下标为(2n - 1, 2n)的数围绕(2row - 2)的倍数左右取值。第⼆⾏的数是:1, (2row - 2) - 1, (2row - 2) + 1, (4row - 4) - 1, (4row - 4) + 1;第三⾏的数是:2, (2row - 2) - 2, (2row - 2) + 2, (4row - 4) - 2, (4row - 4) + 2;第四⾏的数是:3, (2row - 2) + 3, (4row - 4) + 3。
2025-04-08 08:30:00
853
原创 算法(十九)
然后找出那两个数(a,b)比特位为1的那个数,把整体的数分为两部分,a+比特位为0的为一部分,b+比特位为1的为一部分,然后进行异或,把1的放入1里面,0的放入0里面。- 第 2 秒,提莫再次攻击艾希,并重置中毒计时器,艾希中毒状态需要持续 2 秒,即第 2 秒和第 3 秒。- 第 1 秒,提莫攻击艾希并使其立即中毒。中毒状态会维持 2 秒,即第 1 秒和第 2 秒。中毒状态会维持 2 秒,即第 1 秒和第 2 秒。- 第 4 秒,提莫再次攻击艾希,艾希中毒状态又持续 2 秒,即第 4 秒和第 5 秒。
2025-04-03 08:30:00
1957
原创 论坛系统项目测试报告
随着互联网的社交模式的多样化,用户对主体化,结构化的需求日益增长,传统的社交媒体(如微信,微博)存在偏碎片化的交流,而垂直领域(如技术,教育)需要更专注的互动平台。论坛系统可以实现这样的想法,其后端通过Spring,SpringBoot,SpringMVC,Mybaits以及前端HTML,CSS,Js实现。实现用户的注册功能,并将密码以加密的形式存储在数据库中,注册之后再进行登录,确保用户已经进行了注册,也可在个人中心修改用户的头像,用户名称,电话号码,以及密码,这些通常存储在数据库中。
2025-04-01 08:30:00
391
原创 网页聊天室项目测试报告
1.网页聊天室是一种基于浏览器运行的实时在线聊天系统,允许多用户通过网页端进行文字交互,类似于微信的简易版,用户无需下载APP,通过浏览器快速进入临时讨论,支持用户之间的临时通信,好友管理和历史消息记录查看。聊天室采用了SpringBoot,SpringMVC作为后端框架,通过WebSocket实现消息的实时传输,前端使用HTML,JavaScript,CSS构建用户界面,项目的自动化测试部分通过Selenium进行编写,结合Java语言进行测试脚本开发,主要对部分功能进行测试。
2025-03-30 08:30:00
549
原创 算法(十八)
由于整个数组中,需要找的元素只出现了「⼀次」,其余的数都出现的「三次」,因此我们可以根据所有数的「某⼀个⽐特位」的总和 %3 的结果,快速定位到 ret 的「⼀个比特位上」的值是 0 还是 1。这样,我们通过 ret 的每⼀个比特位上的值,就可以将 ret 给还原出来。你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。然后⼀直循环进⾏,直到「进位」变成 0 为⽌。按位与 & 操作能够得到「进位」;请你找出并返回那个只出现了一次的元素。,计算并返回两整数之和。设要找的数位 ret。
2025-03-27 08:30:00
374
原创 算法(十七)
如果我们把数组中的所有数,以及 [0, n] 中的所有数全部「异或」在⼀起,那么根据「异或运算的「消消乐」规律,最终的异或结果应该就是缺失的数。设数组的大小为 n ,那么缺失之前的数就是 [0, n] ,数组中是在 [0, n] 中缺失⼀个数形成的序列。,因为有 3 个数字,所以所有的数字都在范围。,因为有 2 个数字,所以所有的数字都在范围。,因为有 9 个数字,所以所有的数字都在范围。2 是丢失的数字,因为它没有出现在。2 是丢失的数字,因为它没有出现在。8 是丢失的数字,因为它没有出现在。
2025-03-26 08:30:00
256
原创 算法(十六)
想知道最⼤的「以 i 为结尾的和为 0 的⼦数组」,就要找到从左往右第⼀个 x1 使得 [x1, i]区间内的所有元素的和为 0。右下⻆坐标: x1 = i + k,y1 = j + k ,但是由于会「超过矩阵」的范围,因此需要对 m - 1 ,以及 n - 1 取⼀个 min。如果将 0 记为 -1 , 1 记为 1 ,问题就变成了找出⼀段区间,这段区间的和等于 0。[1,1,1,0,0,0] 是具有相同数量 0 和 1 的最长连续子数组。的最长连续子数组,并返回该子数组的长度。
2025-03-25 18:00:00
736
原创 算法(十五)
想知道有多少个「以 i 为结尾的和为 k 的⼦数组」,就要找到有多少个起始位置为 x1, x2, x3... 使得 [x, i] 区间内的所有元素的和为 k。设 i 为数组中的任意位置,⽤ sum[i] 表⽰ [0,设 i 为数组中的任意位置,⽤ sum[i] 表⽰ [0, i] 区间内所有元素的和。设 [0, x - 1] 区间内所有元素之和等于 a , [0, i] 区间内所有元素的和等于 b ,可得 (b - a) % k == 0。例如: -1 % 3 = -(1 % 3) = -1。
2025-03-25 08:30:00
611
原创 算法(十四)
那么我们就不能使 ⽤暴⼒的解法,以及求出整个数组的乘积,然后除以单个元素的⽅法。ii. suf 表⽰: i 位置之后的所有元素,即 [i + 1, n - 1] 区间内所有元素的后缀乘积 ,然后再处理最终结果。然后,我们可以⽤⼀个 for 循环枚举可能的中心下标,判断每⼀个位置的「前缀和」以及 「后缀和」,如果⼆者相等,就返回当前下标。i. post 表⽰:i 位置之前的所有元素,即 [0, i - 1] 区间内所有元素的前缀乘积,是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。
2025-03-22 08:30:00
432
原创 算法(十三)
用dp[i] 表示: [1, i] 区间内所有元素的和,那么 dp[i - 1] 里面存的就是 [1, i - 1] 区间内所有元素的和,那么:可得递推公式: dp[i] = dp[i - 1] + arr[i];v. 那么,红⾊就 = 整个⾯积 - 黄 - 绿 - 蓝,但是绿蓝不好求,我们可以这样减:整个⾯积 -(绿 + 黄 )-(蓝 + 黄),这样相当于多减去了⼀个黄,再加上即可。sum[i][j] 表⽰,从 [0, 0] 位置到 [i, j] 位置这段区域内,所有元素的累加和。
2025-03-21 08:30:00
929
原创 算法(十二)
通过图像我们可以发现, [A,B] 区间内的点都是严格⼤于 D 点的值的, C 点的值是严格小于 D 点的值的。但是当 [C,D] 区间只有⼀个元素的时候, C 点的值是可能等于 D 点的值的。当 mid 在 [C,D] 区间的时候,也就是 mid 位置的值严格小于等于 D 点的值,下次查询区间在 [left,mid] 上。当 mid 在 [A,B] 区间的时候,也就是 mid 位置的值严格大于 D 点的值,下⼀次查询区间在 [mid + 1,right] 上;的数组,预先按照升序排列,经由。
2025-03-19 08:30:00
616
原创 算法(十一)
峰顶左边的数据特点: arr[i] > arr[i - 1] && arr[i] < arr[i + 1] ,也就是呈现上升趋势;峰顶右边数据的特点: arr[i] < arr[i - 1] && arr[i] > arr[i + 1] ,也就是呈现下降趋势。arr[i] < arr[i + 1] :此时「右侧区域」⼀定会存在山峰(因为最右侧是负无穷),那么我们可以去右侧去寻找结果。峰顶数据特点: arr[i] > arr[i - 1] && arr[i] > arr[i + 1];
2025-03-18 08:30:00
735
原创 算法 (十)
当 nums[mid] < target 时,说明 mid 落在了 [left, index - 1] 区间上,mid 右边但不包括 mid 本⾝,可能是最终结果,所以我们接下来查找的区间在 [mid + 1, right] 上。当 nums[mid] >= target 时,说明 mid 落在了 [index, right] 区间上,mid 左边包括 mid 本⾝,可能是最终结果,所以我们接下来查找的区间在 [left, mid] 上。[index + 1, x] 之间的元素,平方之后都是⼤于 x 的。
2025-03-17 08:30:00
930
原创 算法 (九)
iii. arr[mid] < target 说明 [left, mid] 这段区间的值都是⼩于 target 的,因此舍去左边区间,在右边 [mid + 1, right] 区间继续查找,即让 left = mid + 1 ,然后重复 2 过程;ii. arr[mid] > target 说明 [mid, right] 这段区间都是⼤于 target 的,因此舍去右边区间,在左边 [left, mid -1] 的区间继续查找,即让 right = mid - 1 ,然后重复 2 过程;
2025-03-14 08:30:00
693
原创 Linux常用命令
但是一旦代码出现一些意外,导致workdir这个变量的定义语句没有被执行到,没有定义的变量,通过$变量名的方式访问不会报错,而是返回" "字符串。使用cd等命令,需要加上路径的时候,可以使用tab来补全目录,我们只需要按前两个字母,后面按tab,就会帮我们自动补全路径。需要你当前输入的内容,得是唯一的选项,有多个匹配的目录名字/文件名字,按tab不能补全。有的系统上删除目录(递归)每个都要进行确认,我们可以使用rm-rf的方式,直接删除。在linux操作中,涉及到目录操作,都会使用到绝对路径和相对路径的。
2025-03-13 08:00:00
767
原创 算法 (八)
它是 words 中以 ["the","foo","bar"] 顺序排列的连接。它是 words 中以 ["foo","bar","the"] 顺序排列的连接。它是 words 中以 ["bar","the","foo"] 顺序排列的连接。当动态哈希表中包含目标串中所有的字符,并且对应的个数都不⼩于⽬标串的哈希表中各个字符的个数,那么当前的窗⼝就是⼀种可行的方案。它是 words 中以 ["bar","foo"] 顺序排列的连接。它是 words 中以 ["foo","bar"] 顺序排列的连接。
2025-03-11 08:00:00
950
原创 通过form表单构造HTTP请求
浏览器对于html来说就有一定的鲁棒性(容错能力),即使出现了一个错误的代码,也是可以解析并显示出来的。可以有多个属性,多个键值对之间使用空格来分割,键和值之间使用=来分割,键不需要有引号,只需要有双引号。2.Html中,一些特殊的html标签,可能会触发GET请求,如:img,a,link,script。更规范的代码写法,在此处我们就可以看到html中有许多标签,他们往往是成对出现的。当前的标题是Document,浏览器中刷新就会得到,里面改了,浏览器标签也会改。
2025-03-07 17:00:00
315
原创 HTTP协议-fiddler抓包工具
使用http协议的场景:1.浏览器打开网站2.手机APP访问对应的服务器分为两个部分看待:1.请求2.响应它是一种“一问一答”结构模型的协议请求和响应的协议格式是有所差异的。除了上述结构模型,也有其他的结构模型:一问一答(访问网站)多问一答(上传网站)一问多答(下载网站)多问多答(串流/远程桌面)
2025-03-07 08:30:00
298
原创 算法 (七)
因为字符串 p 的异位词的长度⼀定与字符串 p 的长度相同,所以我们可以在字符串 s 中构 造⼀个长度为与字符串 p 的长度相同的滑动窗口,并在滑动中维护窗口中每种字母的数量;因此可以⽤两个大小为 26 的数组来模拟哈希表,⼀个来保存 s 中的子串每个字符出现的个数,另⼀个来保存 p 中每⼀个字符出现的个数。出窗口:若超过了,则进行left-1操作,若此元素在窗口内没有了,则从哈希表中删除该数据。当窗口中每种字母的数量与字符串 p 中每种字母的数量相同时,则说明当前窗口为字符串 p 的异位词;
2025-03-04 08:30:00
945
原创 算法 (六)
题目要求的是数组「左端+右端」两段连续的、和为 x 的最短数组,信息量稍微多⼀些,不易理清 ,我们可以变换成求总和减去x的做法,只需找出那段的最长长度即可。因此,我们可以把问题转化成:求数组中⼀段最长的连续区间,要求这段区间内 0 的个数不超 过 k 个。要,必须设定与代码⼀致),记录当前滑动窗口内数组和的变量 sum = 0 ,记录当前满足条件数组的最大区间长度 ret = -1;iii. 如果经过前两步的左右移动使得 sum == target ,维护满足条件数组的最大长度,并 让下个元素进入窗⼝;
2025-03-03 08:30:00
705
原创 算法 (五)
但是如果继续像方法⼀⼀样,重新开始统计第二个元素( left2 )往后的和,势必会有大量重复的计算(因为我们在求第⼀段区间的时候,已经算出很多元素的和了,这些和是可以在计算下次区间和的时候用上的)。让滑动窗口满足:从 i 位置开始,窗口内所有元素的和小于 target (那么当窗口内元素之和第⼀次大于等于目标值的时候,就是 i 位置开始,满足条件的小长度)。由于此问题分析的对象是「⼀段连续的区间」,因此可以考虑「滑动窗⼝」的思想来解决这道题。后寻找⼀段最短的区间,使得这段区间的和「大于等于」⽬标值。
2025-02-26 10:00:00
523
原创 算法 (四)
ii. 当使用完⼀次双指针算法之后,固定的 a 也要「跳过重复」的元素(一轮走完后进入下一轮,看这一轮固定的数b是否与上一轮a是同一个数,若是同一个,则继续往后走)。ii. 当使用完⼀次双指针算法之后,固定的 b 也要「跳过重复」的元素(一轮走完后进入下一轮,看这一轮固定的数b是否与上一轮b是同一个数,若是同一个,则继续往后走)。iii.当使用完⼀次双指针算法之后,固定的 a 也要「跳过重复」的元素(一轮走完后进入下一轮,看这一轮固定的数a是否与上一轮a是同一个数,若是同一个,则继续往后走)。
2025-02-23 09:00:00
835
原创 算法 (3)
对于 nums[left] ⽽⾔,此时 nums[right] 相当于是 nums[left] 能碰到的 最大值(升序数组)。那对于 nums[right] ⽽⾔,由于此时两数之和是小于目标值的,nums[right] 还可以选择比 nums[left] 大的值继续努力达到目标值,因此 right 指针我们按兵不动;让 right-- ,继续比较下⼀ 组数据,而 left 指针不变(因为他还是可以去匹配比 nums[right] 更小的数的)。因此,我们可以从 a 往后的数开始列举。
2025-02-22 17:30:00
1530
原创 多线程--单例模式
创建的这个对象,不一定轻量,可能在背后会做很多事情,比如,在创建对象的时候,加载几十G的数据到内存中。懒汉模式:类加载的时候不会创建出实例,第一次使用的时候才会创建出实例,不调用,就不创建实例。所以一旦这两操作被穿插了,就容易出现问题,加锁的关键是要保证这两操作是一个整体(原子)!此时代码会出现重复加锁现象,导致画蛇添足,也会产生锁冲突的问题,所以还需进一步的解决。锁加在哪里也是有一定依据的,他不是加了就安全,加的对不对,也是关键!单例模式的代码,只是在首次使用的时候,会涉及到线程不安全问题,
2025-02-22 08:30:00
891
原创 线程安全--死锁
死锁当一个线程出现线程安全问题(线程内可能存在修改操作)时,这时候就要通过synchronized进行加锁操作了。加锁过程中也会出现死锁现象!synchronized是可重入的,也就相当于可重入锁,可重入锁指的是:一个线程连续针对一把锁,加锁两次,不会出现死锁现象。
2025-01-20 08:30:00
873
原创 链表的回文结构
思路:先找到链表的中间节点,然后把链表分为两部分,以中间节点为分割点,分为A,B两种,逆置B链表,然后比较A链表和B链表,判断A,B链表是否相等,并把B链表逆置回来,接入A链表后面还原链表,相等则返回true,不相等返回false,对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。1->2->2->1返回:true。给定一个链表的头指针。
2024-12-17 08:30:00
170
原创 链表分割
给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。然后遍历链表cur为头结点,把小于x的插入到小的链表当中,大于等于x的插入到大的当中;最后,把两个链表结合到一起,注意要把大的链表的最后一个next置为空。现有一链表的头指针 ListNode*构建两个新链表,一个小的,一个大的。
2024-12-11 08:30:00
208
原创 算法【二】
为了⽅便叙述,将「对于⼀个正整数,每⼀次将该数替换为它每个位置上的数字的平⽅和,这⼀个。由于上述两种情况只会出现⼀种,因此,只要我们能确定循环是在「情况⼀」中进⾏,还是在「情。⽽「快慢指针」有⼀个特性,就是在⼀个圆圈中,快指针总是会追上慢指针的,也就是说他们总会。如果改变右边界,⽆论右边界移动到哪⾥,新的⽔⾯的⾼度⼀定不会超过左边界,也就是不会。超过现在的⽔⾯⾼度,但是由于容器的宽度减⼩,因此容器的容积⼀定会变⼩的。因此,变化的过程最终会⾛到⼀个圈⾥⾯,因此可以⽤「快慢指针」来解决。
2024-12-05 08:00:00
1059
原创 数据结构习题
给你一个的数组nums,请你删除重复出现的元素,使每个元素,返回删除后数组的新长度。元素的应该保持。然后返回nums中唯一元素的个数。考虑nums的唯一元素的数量为knumsnumsknumsnumsnumsk系统会用下面的代码来测试你的题解:// 输入数组// 长度正确的期望答案// 调用i < k;i++) {如果所有断言都通过,那么您的题解将被。函数应该返回新的长度2,并且原数组nums的前两个元素被修改为1。不需要考虑数组中超出新长度后面的元素。函数应该返回新的长度5。
2024-12-04 18:45:00
674
原创 算法【一】
给定一个数组nums,编写一个函数将所有0移动到数组的末尾,同时保持非零元素的相对顺序。,必须在不复制数组的情况下原地对数组进行操作。nums =nums =[0][0]算法思路:在本题中,我们可以⽤⼀个cur指针来扫描整个数组,另⼀个dest指针⽤来记录⾮零数序列的最后⼀个位置。根据cur在扫描的过程中,遇到的不同情况,分类处理,实现数组的划分。在cur遍历期间,使[0, dest]的元素全部都是⾮零元素,的 元素全是零。算法流程:a.初始化cur = 0。
2024-12-04 08:45:00
2253
原创 前k个高频词汇
"the", "is", "sunny" 和 "day" 是出现次数最多的四个单词,返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率,"i" 和 "love" 为出现次数最多的两个单词,均为2次。注意,按字母顺序 "i" 在 "love" 之前。出现次数依次为 4, 3, 2 和 1 次。个出现次数最多的单词。
2024-11-29 09:00:00
654
原创 Set和Map练习题2
思路:定义两个字符串,循环遍历第二个输出字的字符串,然后再循环遍历第一个输入的字符串,利用HashSet函数来描述,如果最后输出的字符串不等于第一个输入的也不等于第二个输出的,则进行打印,因为坏键盘至少输入一次,所以要把第一次输入的字符串在加入一遍。思路:利用HashSet函数来写,首先遍历宝石,把宝石加入集合中,然后遍历石头,与宝石进行比较,如果是宝石,就进行计数++,最后返回他的个数。中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。代表石头中宝石的类型,另有一个字符串。
2024-11-23 17:30:00
649
原创 关于Set,Map方面的题1
先创造一个HashSet集合利用set去重的方法去完成,首先遍历数组,如果集合里存在该元素,就把他从集合中删除,如果不存在,就加入集合中.然后又令链表重新为头结点,循环遍历,令新节点的下一个等于原先节点的下一个,令新节点的随机指针指向等于原节点的随机指向,最后返回头结点。指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。节点组成,其中每个新节点的值都设为其对应的原节点的值。个节点组成的链表来表示输入/输出中的链表。,该指针可以指向链表中的任何节点或空节点。
2024-11-23 08:45:00
685
原创 哈希冲突解决-String类
这里要用到方法的重写(hash和equals)把他们转换成整数才能进行%。String类不是一个整型,所以不能直接进行%。
2024-11-22 17:30:00
499
原创 哈希冲突1
首先对关键码集合用散列函数计算散列地址,具有相同地址的关键码归于同一子集合,每一个子集合称为一个桶,各个桶中的元素通过一个单链表链接起来,各链表的头结点存储在哈希表中。虽然哈希表一直在和冲突做斗争,但在实际使用过程中,我们认为哈希表的冲突率是不高的,冲突个数是可控的,也就是每个桶中的链表的长度是一个常数,所以,我们认为。对元素的关键码进行同样的计算,把求得的函数值当做元素的存储位置,在结构中按此位置取元素比较,若。根据待插入元素的关键码,以此函数计算出该元素的存储位置并按此位置进行存放。
2024-11-22 08:15:00
775
原创 点击消除相邻的相同字符
先定义一个变量初始位置为-1,循环遍历字符串,如果位置为-1或者下一个字符与当前位置的字符不相同时,则给StringBuilder里面添加元素,并且位置也++;如果相同时,则把StringBuilder里面的字符弹出,位置--;一个字符串,每次点击可以吧字符串中相邻两个相同字母消除,例如:abbc点击消除成ac,但是相同而不相邻,不相同的相邻字母都是不可以被消除的。出循环后判断,如果位置为-1,则输出字符0;若不为-1,则输出StringBuilder里面的字符串。如果最终消除完后是空串,则打印输出0.
2024-11-21 16:45:00
388
原创 判断子序列
思路:定义两个变量,i和j分别遍历S和T,如果i==j则两者同时++往后走,如果i!=j,则光j++往后走,最后当循环遍历完后,i的长度等于S的长度说明是他的子序列,否则不是。给定两个字符串S和T,判断S是否是T的子序列,即是否可以从T中删除一些字符转换成S。
2024-11-21 08:45:00
296
原创 计数排序
思路:首先定义一个最大值和最小值,求出当前数组的最大值和最小值,根据最大值和最小值确定新数组的大小,遍历原来的数组,开始计数,计数时要减去最小值,为了确保下标不是从0开始,避免空间的浪费,遍历新数组,把其写回原来的数组里,注意写回是要用下标加上最小值,避免不是从0下标开始的。思想:计数排序又称为鸽巢原理,是对哈希直接定址法的变形应用。计数排序在数据范围集中时,效率很高,但是适用范围及场景有限。
2024-11-19 09:45:00
269
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人