- 博客(68)
- 收藏
- 关注
原创 快速排序&归并排序
第一次看别人写的详细快排,归并细节,可能会感觉内容很多,很难学.小生建议:看一遍详解可以但不要指望一次就搞懂全部,搞懂基本原理就行,代码也不要指望第一次就能记住全部,先将代码会写,第一次写代码肯定会很困难.然后今后做题的时候肯定会遇到,今后。他们思想的共同之处:分治。
2025-03-23 15:12:53
132
原创 快速幂&快速乘法&最大公因数&最小公倍数
对于快速幂,举个例子:求2024^2024,结果对1e9+7取模?此时如果你直接调用Math.pow(),肯定是算不出来的;
2025-03-18 12:29:52
204
原创 判断质数(素数)
因此i<num的条件又能进一步优化成i<=Math.sqrt(num) 一定要带等号,就像是16那个例子一样,4。由于该反比例函数关于y=x对称,因此当x == y的时候,就是最中间的点,此时带入。无论是1,还是2 都是对的,他们只是思想不同,但结果是一样的,选一个用即可。根据数学归纳法,验证,除了2,3,一个质数,一定是在6倍数的左边或右边,比如:21开方是一个4点多的数字,此时就只需要枚举到4就够了,16开方是4,枚举到4也就够了,就能正好排除掉重复的组。4是最中间的一组,也是唯一的一组,
2025-03-08 14:25:59
320
原创 仿 RabbitMQ 消息队列7(实战项目)
构造⼀个类表⽰⽅法的参数, 作为 Request 的 payload.不同的⽅法中, 参数形态各异, 但是有些信息是通⽤的, 使⽤⼀个⽗类表⽰出来. 具体每个⽅法的参数再通过继承的⽅式体现和参数同理, 也需要构造⼀个类表⽰返回值, 作为 Response 的 payload.这个是用于服务器返回给客户端执行成功或者失败的信息,要和下面的SubScribReturns区分针对每个 VirtualHost 提供的方法, 都需要有⼀个类表示对应的参数.
2025-02-13 10:11:14
863
原创 仿 RabbitMQ 消息队列6(实战项目)
创建mqserver.VirtualHost在 RabbitMQ 中, 虚拟主机是可以随意创建/删除的. 咱们此处为了实现简单, 并没有实现虚拟主机的管理. 因此我们默认就只有⼀个虚拟主机的存在对于上面出现的两个新的类Router 和ConsumerManager 不用担心,用到的时候,我们再细讲。构造⽅法中会针对 DiskDataCenter 和 MemoryDataCenter 进⾏初始化,同时会把硬盘的数据恢复到内存中.这里的MemoryDataCenter里的init方法是空的,临时加上的,为
2025-02-12 16:51:11
1256
原创 仿 RabbitMQ 消息队列5(实战项目)
硬盘上存储数据, 只是为了实现 “持久化” 这样的效果. 但是实际的消息存储/转发, 还是主要靠内存的结构.对于 MQ 来说, 内存部分是更关键的, 内存速度更快, 可以达成更⾼的并发.
2025-02-12 13:54:45
557
原创 仿 RabbitMQ 的消息队列4(实战项目)
上述代码中, 使⽤数据库存储了 Exchange, Queue, Binding, 使⽤⽂本⽂件存储了 Message.接下来我们把两个部分整合起来, 统⼀进⾏管理.
2025-01-25 17:54:58
162
原创 仿 RabbitMQ 的消息队列2(实战项目)
紧接上一篇博客,我们将对数据库的 增,删,查已经写完了,下面我们就建一个管理数据库的类:DataBaseManager通过这个类来封装针对数据库的操作手动获取bean对象需要的context 必须要先初始化:所以我们在启动类里获取。测试 DataManager使⽤ Spring ⾃带的单元测试, 针对上述代码进⾏测试验证.在 test ⽬录中, 创建 DataManagerTest。
2025-01-20 19:18:00
955
原创 仿 RabbitMQ 的消息队列1(实战项目)
我们以前学过阻塞队列,其实阻塞队列和消息队列的原理差不多。在实际的后端开发中,尤其是分布式系统⾥,跨主机之间使⽤⽣产者消费者模型,也是⾮常普遍的需求.因此,我们通常会把阻塞队列,封装成⼀个独⽴的服务器程序,并且赋予其更丰富的功能.这样的程序我们就称为消息队列(MessageQueue,MQ)
2025-01-19 15:42:37
1273
原创 约瑟夫环问题
如果第一次接触这道题,难免有些陌生。但如果只是在脑子里想象的话,那大概率会是一团浆糊,所以建议在纸上画一画,模拟一下,其实这道题也是能锻炼一定的代码能力的。(这里分享一个做题的小技巧:不要死磕一个题太久,该看答案咱还是得看,有时候退一步是为了更好的进步)。好了,回归正题。题目的大概意思就是:有n个人,围成一个圈,从第一个人开始报数,报到数字m的人出列,同时从下一个人开始继续报数,就这样循环往复,直到所有人都出列。如果听到这,有些人肯定会感觉很熟悉,毕竟可能玩过相似的游戏;
2024-12-11 21:37:25
787
原创 数据结构——堆
你可以想象一下:如果选择了头插,容量不够的时候需要进一步扩容,况且我们使用的是数组模拟堆。如果头插,我们需要整体都向后移动一位,移动后的堆已经不是原来的堆了,此时我们还需要向下调整,光是想想就很麻烦吧。我们知道:堆其实就是优先级队列,很显然,区别于普通的队列二字,他多出了优先级三个字。由于向上调整和向下调整有很相似的逻辑,我就不赘述图了,可以自己尝试画画,加深一下印象。当我们补充offer 代码的时候,会发现一个问题,我们是选择头插还是尾差呢?方法的基本框架都写好了,下面就是建堆了。此时,堆就算是建好了。
2024-09-12 18:08:39
678
2
原创 接口中的方法到底能有具体实现吗?
这是我无意间发现的一个问题,有一天在写代码的时候突然发现,我实现了一个接口却没有将他的抽象方法重写完,这还不是问题,问题是他还不报错。这是怎么回事呢?按理说接口的定义不就是:一个类实现该接口就必须重写其所有方法吗,为啥我没有把他的抽象方法重写完,还不报错呢?难道是编译器出错了?
2024-08-11 18:03:26
956
原创 项目实战_图书管理系统(简易版)
此时我们只需要将用户传过来的用户名和密码和我们存储的用户名和密码对比,如果相同就返回true,反之,返回false。如果能正常显示就说明复制过来的前端代码没问题,不要计较前端加载的那些数据,那些都是假数据,后期那些代码是需要我们改的。简易版只实现上述两个功能,如有兴趣还请看下一期的升级版,升级版将会实现页面上的各个功能,以及解决统一事务的处理方式。接下来就是获取图书列表接口了,我们知道要想返回图书信息,我们得先有一个图书类啊,用来描述图书。后端的代码确保正确了以后,就该修改前端代码了。
2024-08-04 08:10:40
1165
原创 项目实战_表白墙(升级版)
如果我们想将数据存起来首先要有一个数据库吧,所以首先就是要创建一个数据库 ,由于直接在Mysql 小黑框里写有点麻烦,我们可以借助一些软件来更加简单的创建数据库,我使用的是Navicat Premium17,挺好用的,虽然它收费,但是搜搜教程,免费的就来了,懂我的意思吧。我们可以看到数据库里有很多属性,如果只靠我们之前定义的类中的属性肯定是不够的,所以我们要重新定义一个实体类和数据库里的属性对应。这是创建一个message_info表的代码,有兴趣的可以跟着敲一下,就当复习了,没兴趣的直接复制就行。
2024-07-31 21:20:50
6332
4
原创 我的创作纪念日
机缘不知不觉我在优快云已经一年了,想到我写的第一篇博客时的费心尽力,到现在的手拿把掐。一对比,我明白我好像真的进步了。在最近的一个月我偶然看到了我之前的博客,发现阅读量已经破千了,心里默默感慨:这大概就是努力具象化的样子吧。真的,当时我的心里十分的激动,我迫切想要与别人分享,毕竟谁不想顺便去装个杯呢?一举两得。但是回首望去,我的身旁好像没有一人能真正懂我,我终于发现我们好像已经形同陌路了,此刻,我的身后一片虚无,举世茫茫,身旁只有大道相伴,唉,这难道就是强者独有的境界吗?哈哈哈,一不小心又被我装到了吧。
2024-07-18 08:39:34
677
原创 Spring MVC入门5
同样, 如果类上有 @RestController 注解时:表⽰所有的⽅法上添加了 @ResponseBody 注解, 也就是当前类下所有的⽅法返回值做为响应数据。如果⼀个类的⽅法⾥, 既有返回数据的, ⼜有返回⻚⾯的, 就把 @ResponseBody 注解添加到对应的⽅法上即可.也就是说: 在类上添加 @ResponseBody 就相当于在所有的⽅法上添加了 @ResponseBody 注解.如果作⽤在类上, 表⽰该类的所有⽅法, 返回的都是数据, 如果作⽤在⽅法上, 表⽰该⽅法返回的是数据.
2024-07-15 18:05:17
1094
原创 Spring MVC入门4
HttpServletResponse 对象代表服务器的响应. HTTP响应的信息都在这个对象中, ⽐如向客⼾端发送的数据, 响应头, 状态码等. 通过这个对象提供的⽅法, 可以获得服务器响应的所有内容。HttpServletRequest 对象代表客⼾端的请求, 当客⼾端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供的⽅法,可以获得客⼾端请求的所有信息.Spring MVC在这两个对象的基础上进⾏了封装, 给我们提供更加简单的使⽤⽅法.
2024-07-15 10:06:40
801
原创 Spring MVC入门3
简单来说:JSON就是⼀种数据格式, 有⾃⼰的格式和语法, 使⽤⽂本表⽰⼀个对象或数组的信息, 因此JSON本质是字符串. 主要负责在不同的语⾔中数据传递和交换.接下里我们就要演示如何使用JSON来传递对象,详细回应上一篇文章末尾的问题。没有关系, 只是语法相似, js开发者能更快的上⼿⽽已, 但是他的语法本⾝⽐较简单, 所以也很好学。,2,编写代码,接收JSON对象, 需要使⽤ @RequestBody 注解。和字⾯表达的意思⼀样, 这个注解主要作⽤在请求URL路径上的数据绑定。• 国际通⽤语⾔-英语。
2024-07-12 20:16:20
725
原创 Spring MVC入门2
某些特殊的情况下,前端传递的参数 key 和我们后端接收的 key 可以不⼀致,⽐如前端传递了⼀个array2 给后端,⽽后端是使⽤ array 字段来接收的,这样就会出现参数接收不到的情况,如果出现。当有多个参数时,前后端进⾏参数匹配时,是以参数的名称进⾏匹配的,此时由于我们传递的参数的名称和形参是一致的,因此参数的位置是不影响后端获取参数的结果,所以我们将name和id交换位置也不会错。Postman里的KEY要和我们传递的参数要一致不然就会不匹配,相当于不能给这个参数赋值,于是他就默认为null了。
2024-07-11 21:16:51
1010
原创 Spring Web MVC入门
从标题我们就能看见一个很陌生的名词“”,这个名词听着很高大上,但它到底是啥呢?Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc),但它通常被称为 SpringMVCSpring Web MVC 是⼀个 Web 框架。
2024-07-11 15:42:19
1218
原创 最大连续1的个数(滑动窗口)
如果还没有看明白,没关系。详细解释一下:对比以前的滑动窗口,以前的判断条件是求某一段的和最大/求某一段含有不重复的字符最多……,只不过这次的判断条件是0的个数不能超过k,由于这个条件对我们子区间内还要进行操作,所以可能会使你下不去手,困惑。这道题大眼一看是关于翻转多少个0的问题,但是,如果你按照这种思维去做题,肯定不容易。所以我们要换一种思维去做,这种思维不是一下就能想到的,所以想不到也情有可原。但是只要抓住本质,按照那个模版来就能写对,这还需要平时多练。暴力解法就不展示了,就是两个for循环枚举。
2024-05-23 19:08:49
476
原创 无重复字符的最长子串(滑动窗口)
从一开始,我们就定义两个指针,同时指向0位置,让right指针向后走(进窗口),紧接着判断我们的hash表里是否有重复了(判断),如果重复了就出让left++(出窗口)直到hash表里重复的元素全出,再对个数进行更新(更新结果)。这种算法能极大减少指针移动的次数,我们不需要像暴力解法那样让right 每次都要从头再来,而是只需要向后移动一遍就行了。其实写这个暴力解法,写的还不熟,总是忘了下一步该咋写,那就是不熟练,多写写应该就行了。这也是一道滑动窗口的题,可以使用暴力解法,也能使用滑动窗口。
2024-05-18 15:48:36
328
原创 长度最小的子数组(滑动窗口)
他利用单调性,规避了很多没有必要的枚举行为,因此虽然他使用了两个循环,但是他的时间复杂度只有O(1)其实这种滑动窗口的题本质上还是用指针来写的。利用单调性,使用《同向指针》来优化。
2024-05-17 19:38:04
268
原创 三数之和(双指针)
我们通过示例一可以发现如果一个一个枚举的话有三种情况,但是看答案发现它又筛选掉了一种情况,因此需要进行去重。这道题的大体框架就是固定一个数,使三个数的和转换成另两个数的和。主要的难点其实就是去重了。当然还有很多小细节不能忽略。以上排完序再去重的方法很新颖,要好好体会。排序+暴力枚举+set去重。
2024-05-16 09:25:00
353
原创 查找总价格为目标值的两个商品(双指针)
定义两个指针,分别指向两端,然后拿两端值的和和target进行比较,如果target更大:则需要将left++,反之right- -,原理其实很简单:我们知道该数组是升序排列的,因此他的最左边肯定是最小的数,最右边肯定是最大的数,如果此时他们相加的和都要小于target了,肯定是要增大这个和的,而此时只有将left++才能增大这个和。其实啊一切算法的总结都是在暴力的基础上进行的,算法其实就是对暴力进一步的优化。其实我们首先想到的方法肯定是暴力,两个for循环嵌套就能找到,但肯定会超时。
2024-05-14 15:14:00
159
原创 有效三角形的个数(双指针)
然后我们定义一个标志位 pos 指向数组的最后,该标志位其实是代指了三角形的最大的那个边,然后定义两个指针分别表示另两条较小的边,一个指向数组最前,一个指向pos -1 ,然后判断如果此时nums[left]+nums[right] > nums[pos] 此时一定能构成三角形。我们知道数组是升序排列的,如果此时将left++ 一定能构成三角形,因此right~left这一段都能和pos构成三角形,ret+=right-left。
2024-05-14 08:30:00
265
原创 盛最多水的容器(双指针)
解题思路:1,暴力解法(超时)我们可以使用两层for循环进行遍历。找到那个最大的面积即可,这里我就不写代码了,因为写了也是超时。2,双指针法先定义两个指针一个在最左端,一个在最右端:矩形的体积是 底*高 ,我们将两个指针之间的距离当做底,当两个指针移动时底一定会减小,所以如果此时高还在减小,那么他的面积肯定会减小,所以我们就找高增大的作为矩形的两边,因此就有了height[left] > height[right] 这个判断条件,每次移动后都要比较,并取最大的体积,然后重复循环即可。此算法的
2024-05-13 22:00:26
276
原创 快乐数(双指针)
因此我们可以使用快慢指针法:使用这个方法有一个好处就是:当没有环的时候快慢指针一定不会相遇,有环的时候才会相遇,这样也符合我们的分析。上述两种情况是题目告诉我们的,但是假如没有了第二条题目,这道题的复杂的度就直接上来了,因为我们要考虑是否有那种无限循环且不重复的情况。此时我们可以由一个定理来证明一下:雀巢定理。雀巢定理的内容:有 n 个巣 ,有n + 1个鸽子,如果让所有鸽子都归巢,那至少有一个巣里面的鸽子的数量大于1。以上的两种情况其实我们可以归结成一种情况:都是无限循环但是第二种是对于1的无限循环。
2024-05-07 09:48:55
411
原创 移动零(双指针)
我们可以先分区域,将数组的左边都定义为非零区域,将数组的右边都定义为零区域。即【0,dest】是非零区域,【dest,length -1】为零的区域。让cur指针从前向后走,如果遇到0就继续走,遇到非零就停下并且将dest+1位置和cur位置的数据交换位置(注意dest的初始值是-1,cur 是0,这是这种算法的定义方式。你也可以寻找其他初始化的方式,不过相应的代码就要做出改变。不要纠结为啥dest初始值就是-1,这就是这种算法的写法,多写写就明白了)。
2024-05-07 08:35:03
172
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人