自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(92)
  • 收藏
  • 关注

原创 kmp之next函数实现与测试

【代码】kmp之next函数实现与测试。

2024-04-15 20:30:37 84

原创 浮点数加法

浮点数有时候计算结果会出现长尾小数,例如0.1+0.11=0.21000000000002,这种结果很麻烦。用包装类就可以轻松的解决这个问题,不过想着很久没写加法了,高精度加法也不咋写了,自己造下轮子熟悉一下算法,于是就写了个浮点数的加法,原理就是小学加法。

2024-03-18 22:53:22 231

原创 Java、GO、C++语法比较

Java:int[] arr, int arr[]都行,不过建议前者,后者是c-style。c++: *int 指针传递,&int 引用传递,int 值传递。go:arr := make([]int,0),只能在前面。c++:int arr[],只能这样,放前面会报错。go: *int 指针传递传递,int 值传递。2.声明数组(切片)方括号位置。3. 函数传递参数不同。

2024-03-06 22:34:38 194 1

原创 datagrip 使用自定义参数

1. 直接打问号❓,执行的时候会问你这个问号填什么。格式:${xxxx} xxxx是你定义的参数名字。2. 设置参数,执行的时候会问你这个参数填什么。执行就会问你这个参数填什么,定义过会保留。

2023-11-02 18:01:38 510

原创 GO|经典错误之回车与\n

Linux系统里面回车是\n,但是Windows里面是\r\n,因此如果是使用 input = input[:len(input)-1]的方式去掉delim,那就会出错了,因此还是要使用相应的工具包才好,即使用。明明没有什么问题,然后把这段代码放到online go的网站上去跑,输出的是99。这个\r\n是啥, 搜了一下,是Windows系统里面的回车,好家伙,原来问题出在这里了。运行,输入99,回车,输出0。

2023-09-02 14:30:48 698

原创 数据链路层是什么?

数据链路层承接上层的数据,然后使用下层提供的,按照一定的规则,进行数据传输。物理层提供了传输媒体与连接(信道)(数据链路层使用的信道通常是物理层提供的信道),即提供了比特流动的可能性,但是杂乱无章的比特并不是信息,数据链路层需要将上层给予的数据信息组织起来,按照一定规则发送与接收。

2023-08-14 12:46:23 155

原创 及时、完善的测试的重要性

后来换个方向,去看被调用的模块,才发现被调用的模块里面有一个配置的错误,这个错误在这个模块做接口级别的测试的时候是无法发现的,而我写这个模块的时候很着急,只做了接口的测试。具体来说,这个项目使用的是ssm框架,需要进行大量的配置,而配置内容基本上都是差不多的,因此我在对某个模块进行一些框架、中间件的配置的时候,直接从原来项目中复制了过去。去年开发某个项目的过程中遇到过一个bug,让我印象深刻, 因为花费了一个下午的时间才解决,而导致bug的原因却非常的基础,并不是什么难的问题,就是配置错了而已。

2023-08-12 22:48:42 232

原创 八股|ThreadLocal的内存泄露

ThreadLocal为什么可能导致内存泄露?答:由于存储的value并不是存在ThreadLocal对象之中,因此ThreadLocal对象被回收后,value可能无法被回收,这样就造成了内存泄露。

2023-06-14 14:31:04 2455

原创 虚拟机角度下的线程

一个 Java 应用通常是一个进程,这个进程就是jvm,编译好的class文件丢到jvm中,执行时就成为了诸多线程(网络请求过来时,也会生成相应的线程去处理请求)。当运行一个 Java 程序时,操作系统会创建一个 JVM 进程,该进程会解释和执行 Java 代码,从而运行您的程序。 ——我们编写的Java程序运行在一个jvm上面,一个jvm囊括了所有的线程,所有的需求都是由线程完成的。

2023-06-11 12:41:15 769

原创 Java中线程的生命周期

只是普通的进入到了延时等待状态,wait和join会释放锁,所以他们进入等待状态后,还是可能进入阻塞状态的。至于各个状态之间如何转换,这里先不写了,二次复习的时候再深入。其中RUNABLE包含了OS中的执行与准备这两个状态。稍微复杂点:(这张图画的大致正确)

2023-06-11 12:30:31 521

原创 jvm|什么是Java虚拟机?

从OS角度去看,虚拟机就是一个进程,一个软件,我们所有的java程序都是跑在这个软件上面的,这个软件会发出机器指令给操作系统,然后达到操作硬件的目的。既然是一个软件,那么这软件就是跑在内存上面的。里面的栈、堆、方法区等等概念,都是这个软件在内存上自我划分的概念,而不是操作系统划分的概念,因此这台机器叫做虚拟机,是虚拟出来的一台机器,在OS看来,这就是一个平平无奇的进程。上面讲到把JVM放入内存中,好像就像画的那样JVM直接占内存条的一段,其实不是这样的,这是抽象的表示方法,是为了忽略掉与整体无关的细节。

2023-06-04 22:42:04 52

原创 JVM|什么是符号引用?

在Java中,符号引用(Symbolic Reference)是指用一个符号来代替目标引用的一种引用方式。它包括了两个部分:符号引用和解析。符号引用是指在Java类中通过类、方法、字段等名称来引用其他类、方法、字段等的方式。在Java源代码中使用的类名、方法名、字段名等都属于符号引用。符号引用是一个字面量,它可以被存储在类或者方法的常量池中,而不需要提前解析。解析是指在运行期间将符号引用转换为实际的内存地址的过程。

2023-04-21 15:42:57 1932 1

原创 JVM|为对象分配内存空间的流程

为对象分配内存空间的流程,有图,很详细

2023-04-18 17:36:10 360

原创 软件工程|为什么需要统一处理异常?以及如何处理?

后端开发人员可以简单的明白请求是非法的,并察觉到了是因为非法请求导致程序抛出了异常,这是由于开发者熟悉程序的细节,知道为什么程序会跑到这个异常的位置,但是对于运维和前端人员,他们看到了日志里记录专业化(开发化)的异常报错,有时是难以理解的,这对于团队代码开发是不利的。开发是一个持续的过程,在这个过程中总能碰到相似的、同类的异常,如果为了每种异常都去写一个自定义异常,为每种异常去写专门的前端响应,那将会增加开发的复杂程度,而且事倍功半,不利于后期维护。将异常统一起来管理,这是会方便开发的。

2023-03-27 20:23:41 187

原创 debug|freemarker的InvalidReferenceException处理

读了读下面的报错,基本上明白错误的地方了:就是我用于生成模板的数据,有些是空字段,而这个我并没有设置,因此模板引擎报错了。知道这个错误后事情就简单了,要么设置空字段默认值,要么传入的值不能为空即可。好的,百度一下这个异常咋回事,一搜,说是模板里面的放的值不能为空,好家伙,不能为空啊,那读读报的错是不是这个意思呢?密密麻麻的,真让人头疼,先检查下环境配的对不对好了,xml配置、模板地址啥的,检查后发现没问题,那进入到第二步,检查下具体异常是啥;首先找下抛出的异常是啥,

2023-03-08 15:39:08 1502

原创 什么是web框架?

我们解释一个概念的时候,通常会用到其他更多的概念去解释它,如果听的人不理解解释它的概念,那么这个解释是失败的,因此首先要回答一下解释web框架中所用到的概念。回答这个问题前,首先需要需要回答如下子的问题:什么是服务器应用;如何编写web程序;软件框架的概念以bs架构为例子解释。浏览器、服务器构成的b/s软件架构风靡全球,b为浏览器,s为服务器。

2023-02-24 17:28:53 2878 1

原创 基础图算法|prim算法的Java实现

prim算法的Java实现

2023-02-11 19:30:26 131

原创 算法基础|prim算法的实现

prim算法的实现,比较代码风格偏工程,看着复杂,其实还是很简单的。。

2023-02-07 17:01:26 69

原创 算法基础|迪杰斯特拉算法初次实现|DijkstraAlgorithm

迪杰斯特拉算法

2023-02-03 16:18:17 102

原创 图|AcWing 846. 树的重心

在树中:有n个结点,则有n-1条边,由于用图的方式表示树,也要在意每条边的方向,由于每条边两个方向,因此一共最多2*(n-1)条边,方便起见开2N条边。这里的e存储的是边,一个e对应着一个有向边。j = e[i],代表着i这个点到j有条边。由于是树,肯定存在i = e[j];算法不难理解,实现比较麻烦,sum与res的使用很巧妙,是一个工具写法,可以背下来。学习静态链表写法对于找工作有什么意义呢?由于是双向的,所以e得开2N,ne也是如此。2023年2月2日17:17:53。

2023-02-02 19:05:42 93

原创 动态规划|188. 买卖股票的最佳时机 IV

dp[i][j][1]代表第i天时,第j次买卖时持有股票时的收益;dp[i][j][0]代表第i天时,第j次买卖时持有股票时的收益。

2023-01-16 15:08:44 119

原创 动态规划|121. 买卖股票的最佳时机

由于标签中说这道题可以用动态规划去做,那么根据动态规划题目的规律,最后的答案肯定是dp[i]之类的,这个i大概率是天数,也就是维护第i天的最大盈利。上面讲到了,对于i天,只有两种状态——持有股票或者不持有,因此将dp[i]扩展一下,扩展成dp[i]{0,1},dp[i][0]代表第i天不持有股票时的最大收益,dp[i][1]代表第i天持有股票时的最大收益。由于我不是计算机或者数学的天纵奇才或者大罗神仙,没法凭空想出一些绚丽的转移方程,然后一步优化到位,因此我只能通过简单的做法一步一步蚕食这道题目。

2023-01-13 16:40:00 649

原创 动态规划|474. 一和零

刚开始的时候,我是把k循环放到最里面去的,跑出来的结果很大,而且一个都不符合,分析了一下发现如果把[k]放到最内层去遍历,会导致重复使用,因此【k】必须是最外层的循环。像极了中学时代的那种看上去花里胡哨,实质上是根据考点设计出题的题目。题目看上去很唬人,但是恰恰是这样说明该题设计的目的很强,指向dp的01背包,就是为了考01背包设计的。其中:k表示候选元素的范围,(i,j)表示0与1的上限个数。既然有了转移方程,那么该如何遍历呢?为什么说是考察01背包,中描述的很清楚,不赘述。

2023-01-10 14:49:47 257

原创 动态规划|剑指 Offer II 101. 分割等和子集

找个问题可以放大一点,转化为:nums是否存在子集Q,这个Q的所有元素加起来等于一个tar(tar是一个任意的给定的正整数)。题目给了一个数组nums,要求说是在数组里面找个一个子集,找个子集的和与剩下的元素组成的子集的和相等。在这个问题中,当tar=sum/2时,就是该题目原本的解答了。一些前提条件判定的分析就不写了,比如说sum必须为偶数, halfSum > maxNum啥的。相当于:一个集合N,是否存在一个子集Q,sum{Q} = sum{N-Q}简洁的说法:nums设为集合N,N是否存在子集Q,

2023-01-06 17:10:59 328

原创 剑指 Offer II 097. 子序列的数目--Java

代表字符串的子串,这个子串从头开始直到i个字符,eg. str=“1234”,str[:3]意义就是"123"(严格意义的比较,不仅是字符相等,还得是所在位置的一致)。既可以是合法子串的末尾元素,也可也不是,因此这两种情况都要考虑。是b,而这个b可以由s[2]或s[3]或s[4]满足)集合划分:这群相同的子序列中,最末元素是否是。个字符串的动态规划问题,一般就是二维dp,相同的子序列,属性为数量。时,处于【不是s[i]】分别代表一个字符串。的中的合法子串数量和。的中的合法子串数量和。相等,既然如此,那么。

2023-01-06 10:45:48 261

原创 动态规划|AcWing 901. 滑雪

因此对于该题目,首先是理解怎么一回事,然后去体会记忆化递归的妙处,然后再去多做相似、相关类型的题目,对递归、计划化搜索熟悉后再回来看这道题,常看常新。使用二维数组记录,从某个点出发时的最长距离,这样当想要得知点(i,j)最长距离时,只要比较点(i,j)上下左右四个点哪个点最大即可。1.只能从高处向低处滑行,这个条件保证了从f(i,j)递归时不会重复走到f(i,j)。对于只学过一点算法的入门者而言,想要通过自己写出题解中的递归难度是非常大的。,想要通过这一道题完全掌握该题要考察的知识点是不可能的。

2023-01-03 15:38:25 186

原创 动态规划|285. 没有上司的舞会

原本不想写题解的,因为难度确实不大,但是阳了之后逻辑能力被严重耽误,很那思考多一些的东西,感觉大脑的“内存”不够了,遂借助文章的形式梳理一遍题目,顺便写下来充实博客。:根据题目,观察可知,父结点的状态,可以由子结点转移过来,这样一来,就可以使用dfs的方式遍历整个树,然后进行比较root结点两个状态中那个最大即可。当结点i不取值时,其子节点们就可以取值了,这样一来,i结点的最大值为其所有子节点最大值的和(取值或者不取值~);因为树上每个结点都是可以一个状态的集合,当做状态来去转移,也就可使用动态规划了。

2022-12-27 17:46:35 312

原创 动态规划|最短Hamilton路径

2022年12月22日11:23:10“n个点,从0开始,到n结束,求涵盖所有点的最短路径”有n个点,有n!条路径可以选择,不过题目中要求是0开始,n-1点结束,因此一共是(n-2)!条路径,在(n-2)!条路径中选择一条最短的路径即为答案,但是时间复杂度太高了。使用动态规划来减少重复。设w[][]为图的邻接表,用以表示点与点之间的权值;f[j]为终点为j时的所有路线的集合(起点先不关注),而终点为j时,前面点的数量还是没有确定的,需要进行确定才可以进一步减少集合的范围。此时引入一个路径状态。

2022-12-22 11:41:45 495 1

原创 动态规划|石子合并——遍历顺序的思考(Java)

其中f(i,j)依赖的前面数据是图中标出的蓝色与绿色部分,因此使用常见的双循环遍历的时候,就会因为无法获得绿色部分数据而出错,避免这种情况可以使用倒叙遍历,就是倒着遍历,从下往上,从左往右,这样就可以满足转移时对前文数据的依赖。而通过长度进行遍历的方式本质上是斜着遍历,即下图中蓝色、绿色、黄色、红色的遍历顺序,这样遍历,每次用到前面的数据的时候,上一次遍历都已经准备好了。

2022-12-18 22:55:32 160

原创 debug|在oj上使用java,报错Non Zero Exit Code的一次debug

/这种写法oj上过不去。这样写才可以,我没去细究为什么会这样,等oj用熟了再去了解下原因。

2022-12-16 16:42:56 489

原创 排序|快速排序的简单实现

其实很简单,把比x小的数都放到x的左边,把x数大的数都放到x的右边,此时x在数组的下标为i,这个i其实和数组排序后x所在的位置是一样的。也就是说这个分组操作之后,就将x的位置排好了。而且也将数组更加的有序化了。至于如何分组,可以使用一种朴素的实现方式,那就是直接创建两个数组a与b,用以存储大于等于x的数和小于x的数。至于x,不放入数组中,或者放入a中最末尾。其实漏掉了一个重要的东西,就是x的位置在分完之后代表着什么,有什么意义?很多教程里面讲到,这个函数需要把数组分成一边大于某数x,另一边小于x。

2022-11-29 11:08:39 205

原创 算法题|剑指 Offer II 038. 每日温度

单调栈很简单,就是在栈的基础上进行了一些改动,让每个入栈元素都与栈顶元素进行比较,如果入栈元素大于栈顶元素,栈顶元素则弹出,直至空栈或者栈顶元素大于入栈元素(也可以反过来,单调增或单调减都可以的)。这样就能表现一个特别的效果,即从栈底到栈顶呈现出单调的特性,栈底也保存着当前最大(或最小)的元素,入栈元素是弹出栈元素左边第一个比它大(或小)的元素,等等。这道题是很好的一道单调栈的练习题,感觉并不是有问题然后再出现解答,而是根据单调栈这个数据结构设计的题目。也就是说是跟着一个答案寻出了一道题目。

2022-11-08 19:14:38 59

原创 算法题|滑动窗口的最大值

校核方式为:查看元素中堆顶元素是否属于滑动窗口的范围内,查看的方法为比较堆顶元素下标是否大于滑动窗口左指针下标(i-k)。如果堆顶元素不在滑动窗口范围内,则弹出该元素,重复校核新堆顶元素,直至堆顶元素满足校核要求。每加入一个元素,视为滑动窗口向右移动一格(此时滑动窗口右指针为i),每次加入元素对该优先队列进行校核。官解第一种方法使用的优先队列,这个方法我觉得很妙,于是补充一下细节,加深对题目的理解。输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3。

2022-10-18 14:42:24 249

原创 Redis常见问题

redis中比较基础的一些概念。

2022-09-26 15:39:04 304

原创 一次NoClassDefFoundError的解决

然后翻了一下,发现在同一个文件目录下面,有一个之前写的名字叫duck的接口,可能是这个接口的问题,注释掉试一下,果然,就是这个接口存在,报了这个错误。说白了就是两个重名的类,是没办法启动,虽然一个是大写的,一个是小写的,但是在Windows系统里面是不分大小写的。不过其实报的错中已经很明显提示到了,第一行的括号里面就有写——(wrong name: xxx/duck)运行的时候报了上面那个错误,我觉得很奇怪,怎么没找到我的类。

2022-09-06 20:14:51 305

原创 Java基础|HashCode()与identityHashCode()

这两个方法都是用于计算标识哈希码,不过性能不一样,HashCode()性能好一些,通常使用的是这个方法,不过HashCode()与identityHashCode()计算出来的标识哈希码值有时候是不一样的,这取决于HashCode()是否有被重写,identityHashCode()是根据Object类hashCode()方法来计算hash值的,所以无论是否重写HashCode(),值都是不会变的。下面一个小例子就可以体现出来。...

2022-08-31 16:31:18 361

原创 JVM与JMM的关系

缓存这东西有利有弊,利就是速度快,省时省力,弊就是当原始数据改变时,如果不采取相关措施,会造成缓存中存了个假数据,在线程并发时这种情况更常见,这个问题就是常说缓存不一致性的问题,很难受,需要想办法解决。引入一个协议吧,就是一组规定,让计算机听从这些规定,避免造成不一致的情况。在JVM中如果不做相关的规定,也会出现如此的情况,毕竟jvm中也有类似的缓存结构存在,存在缓存,存在并发,就存在缓存不一致性的问题,那么就需要引入一些列规定去约束Java虚拟机的运行,而这一系列的规则就是JMM,即Java内存模型。..

2022-08-30 11:17:35 260

原创 Java基础|Java并发相关api

操作线程有两个地方,一个是父类object中定义的wait()等方法,另一个是Thread类中定义的相关方法。start():重启当前线程;调用当前线程的run()run():通常需要重写Thread类中的方法,将创建的线程要执行的操作声明再此方法中这个方法开发者很少调用,因为这是线程的方法的容器,直接调用只是普通的调用方法而已,不能开启新线程,开启新线程需要调用start()这个方法。getName():获取当前线程的名字setName():设置当前线程的名字。...

2022-08-29 17:03:20 298

原创 项目debug|no String-argument constructor/factory method to deserialize from String val

400按照以往的经验,是前端的错误,一般来说就是前端发了莫名其妙的东西,后端没法解析,但是这次我觉得不是前端的问题,但是到底哪里出错了呢?1.由于是Jason字符串没法正常反序列化,可能是我的@PostMapping映射地址写错了,也许是映射到其他controller了上面了,但是经由检查,发现并未写错,因此这个可能性排除。不好说,不过检查了一下,发现没有问题(后来我试了一下,如果是注释错误,那么应该报500的错误,即服务器内部错误,而不是400)看了一下,没有问题,符合设计,那么问题就应该出在后端了。..

2022-07-20 14:02:07 8733

原创 算法题|剑指 Offer 35. 复杂链表的复制

题目出处:力扣描述:请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。---考察如何进行深拷贝;根据题解,解法有2种,第1种为复制后拆分,第2种为使用哈希表思路如下:复制后拆分代码量比较大, 稍后再实现,先选择实现哈希表做法:实现如下:(可以对照着上面的思路看代码实现)...

2022-07-13 10:20:07 46

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除