自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 系统学习算法:专题十二 记忆化搜索

其实难的不是记忆化搜索,而是如何写出暴搜的代码,也就是dfs,如果暴搜能过就过,过不了就看看能不能用记忆化搜索来优化,不是所有的暴搜都能转记忆化搜索的,要看是否存在相同的计算,如果有,那么就添加一个备忘录,dfs进去的时候就看一看备忘录,有就用,没有就算一次,然后再保存到备忘录,几乎是个模板,难的还是dfs综上所有递归回溯的部分就基本学完了,接下来会继续学其他的算法。

2025-02-24 23:34:42 640

原创 系统学习算法:专题十一 floodfill算法

floodfill算法简单来说就是求出相同性质的联通块比如在上面这个矩阵中,如果我们要求出所有负数的联通块,就可以使用floodfill算法,但联通必须是上下左右,斜对角的不行其中实现的方法有深度优先遍历(dfs)以及宽度优先遍历(bfs),这里主要使用的是dfs跟之前走迷宫的方法大致一样,难度不大其实跟之前也没什么太大的区别,主要学到了一个正难则反的思想,其他还是老样子。

2025-02-18 23:42:50 677 1

原创 系统学习算法:专题十 递归,搜索与回溯综合练习

至此所有的综合练习全部写完,应该对dfs有了更深刻的感受,其中重点是恢复现场,剪枝,画决策树,确定结束条件以及走迷宫类型的题,可以用映射关系来记录上下左右,同理也可以记录八个方向还有对角线和九宫格的写法基本也就是暴搜,思路不算太难,主要要有代码实现能力,能将决策树的思路转化为代码接下来还有floodfill和记忆化搜索两个小专题,学完就算大体地学完了递归,搜索和回溯这个大专题了,进行加油!

2025-02-16 13:25:26 1006

原创 系统学习算法:专题九 穷举vs暴搜vs深搜vs回溯vs剪枝

解决全排列,集合这种需要枚举许多情况并回溯的,先画出决策树,决策树不唯一,只要思路是对的,通过代码来实现,其中需要注意回溯后要恢复现场,最后就是正确的。

2025-02-04 20:04:16 1068

原创 系统学习算法: 专题八 二叉树中的深搜

深搜其实就是深度优先遍历(dfs),与此相对的还有宽度优先遍历(bfs)如果学完数据结构有点忘记,如下图,左边是dfs,右边是bfs而二叉树的前序,中序,后序遍历都可以使用递归来编写,而这三种遍历都属于dfs所以本质还是递归,只是换到了二叉树这个数据结构而已。

2025-02-02 21:40:19 1043

原创 系统学习算法: 专题七 递归

既然循环和递归可以相互转化,那么什么时候用循环写着舒服,什么时候用递归写着舒服当像左边这样有很多分支的话,就用递归舒服,像右边这样单边树就用循环比如遍历数组,它不会出现什么回溯,也没有其他多余的选择,就下标一直往后走就行了,就用循环很舒服像汉诺塔那道题,因为有三个柱子,所以往那边移动就有多个选择,选择的地方有很多,分支就多,很复杂,所以递归写着就很舒服。

2025-01-31 16:49:51 754

原创 系统学习算法:专题六 模拟

模拟算法其实也不叫算法,这类题就是题目告诉你具体流程是怎么样的,让你用代码来实现,思路上不怎么难,主要考察代码能力,将想转化成做,模拟题目的操作步骤,这就是模拟。

2025-01-25 18:45:38 680

原创 系统学习算法:专题五 位运算

1.这六种就是常见的位运算符,无进位相加就是在二进制中,两个数的某一位1和1可以进位,但是异或就不进位,相加后为0,跟相同为0,相异为1一个意思2.第一小类题型,第几位就用右移或左移操作符来控制,是0还是1就&1就能判断了3.第二小类题型,要修改成1,那么就 | 1就行了,修改哪一位就让1左移多少位即可4.第三小类题型,修改为0,那就是& 0即可,但是只是让第x位,所以其他位要为1,那么就只能让1左移x位,然后取反再按位与即可。

2025-01-22 19:48:43 725

原创 系统学习算法:专题四 前缀和

然后就来想优化,我们之前做过一道题,也是求和为k的子数组个数,在那一道题我们使用的是滑动窗口,这一道题好像跟那道题一模一样,但其实有一点区别,那就是之前那道题中数组的值全是正数,那么就具有单调性,而这道题的提示中写了数组中的值有正有负,所以就不能保证右边界往右滑动时是递增的,左边界往右滑动时是递减的,不具有单调性,所以这道题不能使用滑动窗口。在数学中,-1%2=1,即取模的值都为正数,而在Java中,-1%2=-1,所以这个是有矛盾的点,因此我们要将Java中取模操作后的值进行负转正,也就是统一返回正数。

2025-01-15 23:01:05 868

原创 MySQL事务(理论理解)

事务其实就是将一组SQL语句打包成为一个整体,而这组SQL语句要么全部执行成功,要么全部执行失败有什么用呢?举个简单的例子,我向你转钱,里面分为两个SQL语句,一个是我的钱减少,一个是你的钱增加,如果不使用事务,那么如果出现某些问题,导致只执行其中一个SQL语句,而另外一个SQL语句执行失败,那么就会发生两种情况:我的钱减少执行成功,你的钱增加执行失败,那么世界就莫名其妙少了一笔钱,我亏了,你也亏了我的钱减少执行失败,你的钱增加执行成功,那么世界就莫名其妙多了一笔钱,我赚了,你也赚了。

2024-12-09 18:07:41 549

原创 系统学习算法:专题三 二分查找

因为按照上面分析的过程中,left会跳出第一个区间,来到第二个区间的最左端点,而right不会跳出第二段区间,会来到第二个区间的最左端点,也就是说当left==right时,已经就是最后结果了,所有都判断查找完了,就没必要再进循环去判断,如果进入循环的话,那么就会命中第二种情况,即x>=t,那么此时right=mid就还是没有发生移动变化,这时就死循环了。当然总会觉得有些特殊情况没考虑到,比如0和1会不会不符合这个模板,其实将0和1带入代码,就会发现0根本就不进循环,直接就返回left,而left也是0。

2024-12-03 14:06:44 688

原创 系统学习算法: 专题二 滑动窗口

题目的意思也很简单,就是找到s字符串中涵盖t字符串所有字符的最小子串,还是先用暴力枚举的方法,大致理清操作步骤,定义left和right,left和right都从0开始,如果出现了t中的字符,对应计数器就++,然后right一直往右移动,直到最后一个字符,然后left往右移动一步,right又从left位置开始,继续往右移动,循环上面的步骤,直到left也到最后的字符位置。直到len-1开始切割。

2024-11-29 23:20:34 730

原创 数据结构:Map和Set(Java)

讲Map和Set这两个数据结构之前,我们要先了解一下搜索树的概念,因为TreeMap和TreeSet底层就是由搜索树实现的。

2024-11-27 00:20:10 812

原创 系统学习算法:专题一 双指针

至此,双指针算法就大致学习完毕了,我们来稍微总结一下双指针只是一种思路,并不是真正的指针,既可以用数组下标作为指针,也可以用值作为指针。

2024-11-04 23:20:12 916 2

原创 MySQL的约束和三大范式

这样看起来是断断续续的,但其实在生产环境下是很常见的,因为我们客户端insert的请求会发送到负载均衡器,而负载均衡器都会为每台服务器都预先分配一区段的主键值,比如DB-A这台服务器对应的主键值为1-10000,DB-B这台服务器对应的主键值为10001-20000,DB-C这台服务器对应的主键值为20001-30000……则如果给student表里面insert into(1,‘张三’,4)就会报错,因为class_id添加为4,但是class表中id那个字段没有4,只有1,2,3,所以不符合外键约束。

2024-11-04 10:42:30 790 1

原创 MySQL的增删查改(基础)一

其中order by 列名表示按照该列名的值进行排序,而ASC代表升序(从小到大往下排),DESC代表降序(从大到下往下排),注意的是desc这个关键字之前代表描述表,现在又代表降序,一个关键字代表了两个意思,这是MySQL不好的方面,当初设计的时候就没有很好的规范,我们要吸取这个教训,写代码的时候要注意一下命名规范。这里就是指定对应的字段插入后面对应的值,没有指定到的字段就使用的默认值,同时后面的值也不是像上面那样按照创建表时的字段的顺序来对应的了,而是按照前面指定字段的顺序来对应。),(值1,值2……

2024-09-28 18:25:43 1683 1

原创 MySQL数据库基础

每一个数据库都是由行和列组成的二维表格,其中要先创建列,也就是属性,再创建行,比如我们要创建一个保存学生数据的数据库,我们首先要确定我们需要保存学生的哪一些属性,毕竟我们不可能把学生全部所有信息都保存下来,这时我们就要根据需求,找到我们需要的属性,比如我们想要保存一个学生的姓名,学号,班级,那么我们在数据库中就要先创建这三列的属性,然后再根据每个学生的具体信息,一个学生对应一行数据行(也叫作数据记录),那么我们将所有的学生信息存入这个数据库后,我们就保存了所有学生的姓名,学号,班级在这个数据库中。

2024-09-28 15:48:53 1009

原创 二叉树前序,中序,后序非递归遍历(Java)

首先创建一个栈和顺序表,按照根左右的前序遍历顺序去遍历这棵树,一直往左孩子方向遍历,每遍历到一个结点就入栈并且加入到顺序表里,如果没有左孩子了,就拿出栈顶元素,看它是否有右孩子,如果有,又从右孩子开始,往左孩子方向遍历,如果没有,就继续拿出栈顶元素,如此循环,直到栈为空。当遍历到A,左孩子为null,此时A为栈顶元素,A有右孩子B,所以B入栈,然后B没有左右孩子,所以B出栈,此时A没有左孩子,A为栈顶元素,A有右孩子B,B又入栈,然后B没有左右孩子,B又出栈……但是这里有可能出现死循环,就是下图这种情况。

2024-08-29 21:42:33 333

原创 二叉树练习习题题集二(Java)

思路:从上到下,从左到右,先遍历到的先打印,可以用队列的特性“先进先出”实现,先放进根结点,并创建一个一维数组,然后求此时队列的个数size,每次弹出队列的一个元素放进一维数组,size--,如果size==0,就将这个一维数组放进存一维数组的一维数组,然后将不为null的左右孩子放进队列,如此循环即可。3.到“2”这个结点,将结点的值拼接,拼接"2",“2”这个结点有左孩子,拼接"(",然后递归到“4”这个结点,现在字符串为"1(2("1.按照前序遍历顺序,根结点直接拼接到字符串,现在字符串为"1"

2024-08-29 13:57:07 818

原创 二叉树练习习题集一(Java)

首先是有多组数据,所以要用hasnextLine()来读取,然后用一个变量i来遍历字符串,同时定义一个返回值为树结点的方法叫creatTree,在这个方法里,定义一个树结点初始为null,如果i对应的字符不是#,则创建对应字符的结点,i往后走一位,然后让该结点的左孩子等于创建左树,让该结点的右孩子创建右树。判断根结点的左右子树是否对称,主要看两个方面,一个是结构,然后是值,这跟上面那道判断是否是相同树的题类似,只不过传参的时候,一个传左子树的左孩子和右子树的右孩子,一个传左子树的右孩子和右子树的左孩子。

2024-08-17 20:02:42 977

原创 用栈实现队列

栈是先进后出,队列是先进先出,所以只靠一个栈是不能实现队列的,但是两个栈就可以,一个栈s1用来模拟入队列,一个栈s2用来出队列,当需要pop和peek时,如果s2为空,则将s1里的元素又放进s2,因为放进s1的时候是先进后出,所以s1放进s2的时候又是后进先出,这样操作,相当于负负得正了,最后s2的栈顶元素,就是最先入s1的元素。

2024-07-22 14:21:51 221

原创 用队列实现栈(Java)

q1,q2两个空队列,如果模拟入栈1 2 3,然后出栈,出栈元素为栈顶元素3,那么用队列实现就可以q1进队列1 2 3,然后将1 2入队列q2,3出队列,即第size-1个元素为栈顶元素;如果只是获取栈顶元素,则将1 2 3入队列q2,每一个元素入队列q2时,用一个变量记录下来,那么最后赋值给这个变量的元素就是最后的元素,也就是栈顶元素。如果后续要继续加入元素,则应该放进有元素的队列,然后每次pop或top,都将有元素的size-1或全部入到另一个空的队列,然后如此变换,一个为空,一个为非空。

2024-07-22 13:53:16 310

原创 栈练习习题集

当一开始栈都为空时,第一个元素放进去肯定是当前的最小值,最小栈放进该元素,然后当后面入栈的元素小于等于最小栈的栈顶元素,则放进最小栈里面,其中当等于时,也应该入栈,因为如果不入栈的话,那么该元素出栈后,会把最小栈原来的栈顶元素也出栈,但是这个栈顶元素保留的是之前的最小元素。而当1'==1入栈时,则最小栈有:3 1 1',那么当普通栈1'出栈时,最小栈也出栈1',此时普通栈为3 1,最小栈的栈顶元素为1,是普通栈的最小值,是正确的。1.是左括号时,就入栈,然后字符串继续遍历;

2024-07-20 15:52:05 562

原创 链表面试练习习题(Java)

首先判断是否有环,跟上面一题一样,接下来,如果有环,求出环的开始结点,还是快慢指针,快指针一次走两步,慢指针一次走一步,用两个公式表示快慢指针走的路程,其中C是环的长度,K是相遇点距离环的开始结点的长度,X表示头结点到环的开始结点的长度。法二:如果相交,那么相交之后的链表长度是相同的,所以两个链表长度的差值就等于相交前面的链表长度差值,因此只需要求出两个链表的长度,相减得出差值,让较长的链表先走差值步,然后再以相同的速度往后走,则相等时相交。1.fast走的路程S1:X+NC+C-K。

2024-07-18 18:46:29 488

原创 链表面试练习习题集(Java)

如果一开始头结点就等于val,即示例3的情况,那么按照上面的代码就不能将头结点移除,所以我们要判断一开始头结点是否为val,如果为val,则新头结点为头结点的后一个,因为移除完后的新头结点有可能仍然等于val,所以不是用if而是while,如果头结点为null,则说明全是val,如示例3的情况,此时就返回新头结点(也就是null)当结点为奇数个数时,刚好为中间的结点,当结点为偶数个数,为中间的第二个结点,根据快慢指针一个走两步,一个走一步,刚刚好都满足,所以就不用分类讨论了。

2024-07-17 20:33:14 768

原创 力扣88.合并两个有序数组(Java)

一般两个有序数组合并,都是从后往前赋值,因为两个数组中的最大值相比较出来的最大值,就是合并后的最大值,所以可以直接丢在最后面,然后如此类推,直到某一个数组被比较完,如果是第一个数组,则只需要将第二个数组剩下的直接赋值过去即可;如果是第二个数组,则不用管了,因为前面放的就是第一个数组的值。同时注意特殊情况,如果第一个数组的有效值为0个,合并后就是第二个数组,则只需要将第二个数组复制给第一个数组即可;如果第二个数组的有效值为0个,则不需要进行任何操作,合并后就是第一个数组。

2024-07-16 19:51:50 220

原创 力扣26.删除有序数组中的重复项(Java)

采用双指针,一个用来记录赋值到哪里,一个用来寻找哪个该赋值。

2024-07-16 19:45:24 99

原创 力扣27.移除元素(Java)

虽然很简单,但是还能再优化,按照上面的代码,会重复赋值需要保留的数据,例如最坏的情况,没有等于val的数,数组:[1,2,3,4,5,6,7],val=8,那么就会将该数组重复赋值,但是一个没有必要移除,这时就该换个思路,即从如果有不同与val的就赋值,改为如果有与val相同的就赋值,这样子就保证了只要我们进行了操作,就一定是在移除相同元素。这样子就保证了只要我们进行操作,就一定是在做有用功,对之前可能做有用功,也有可能做无用功进行了优化。

2024-07-16 18:52:32 466

原创 CSS期末复习速览(二)

4.行内块元素:常见的行内块元素:<img/> <input/> <td>,同时具有块元素和行内元素的特点,特点:和相邻行内元素(行内块)在一行上,但是它们之间会有空白缝隙,一行可以显示多个(行内元素特点);高度,行高,内外边距都可以控制(块元素特点)2.块元素:常见的块元素:<h1>~<h6> <p> <div> <ul> <ol> <li>,特点:自己独占一行;3.行内元素:常见的行内元素:<a> <strong> <span>,特点:相邻行内元素在一行上,一行可以显示多个;

2024-06-16 15:59:05 537

原创 CSS期末复习速览(一)

14.line-height设置行间距,行间距由三部分组成:上间距,文本高度,下间距,例如行间距为26px,如果文本大小为16px,那么上下间距为(26-16)/2=5px,主要用途:让行间距等于盒子的高度,实现文字在当前盒子内垂直居中。18.链接伪类选择器,四种:a:link(选择所有未被访问的链接),a:visited(选择所有已经被访问过的链接),a:hover(选择鼠标指针位于其上的链接),a:active(选择鼠标按下未弹起的链接)17.并集选择器,格式:标签1,标签2……},代表选择多个标签。

2024-06-15 17:53:25 520

原创 java期末细节知识整理(三)

当类的实例被创建时,成员变量被创建。对于静态成员变量(也称为类变量),它们与类本身相关联,因此它们在程序开始运行时被创建,并在程序结束时被销毁。99.9:9,虽然要9是整型,但是因为前面99.9是浮点数,所以返回的也是浮点数,即9.0。19.java主方法的访问控制权限必须是public的,且是static的,它的参数是字符串数组。6.局部变量在方法、构造函数或块内部声明,成员变量在类体中声明,但在方法、构造函数或块之外。7.成员变量没被赋初值,会自动初始化为默认值,局部变量则不会,如果调用则会报错。

2024-06-10 13:50:31 269 1

原创 java期末细节知识整理(二)

11.String s1="abc",s2="abc",这两个字符串都指向同一个地址(相当于C语言中的常量字符串,即如果原来存在一个字符串,后面又有一个字符串等于该字符串的内容,那么就不会再申请空间创建新的字符串,而是会直接指向原来存在的字符串),而String s3=new String("abc")和String s4=new String("abc"),则是两个不同的地址,因为new关键字就是创建一个新的对象、6.C语言中,二维数组定义时必须有列,可以无行,而Java中,必须有行,可以无列。

2024-06-10 12:26:47 494

原创 java异常处理知识点总结

如果有时候在这些类中没找到合适的异常类,例如密码错误,用户名错误这些,我们就需要自定义异常,格式一般为定义一个类然后继承异常,然后在构造方法中调用父类的构造方法即可例子如下调用例子如下if (!throw new PasswordException("密码错误");注:自定义异常通常会继承自Exception或者RuntimeException,继承Exception的异常默认是编译时异常,继承RuntimeException的异常默认是运行时异常。

2024-06-08 16:29:59 1020

原创 java期末细节知识整理(一)

20.boolean——1字节,byte——1字节,short——2字节,int——4字节,long——8字节,float——4字节,double——8字节,char——2字节,转换优先级为byte—>short—>char—>int—>long—>float—>double,boolean不能转换。19.常考的转义字符:\b(后退一格),\n(换行),\t(横向跳格tab),\\(输出一个\),\uxxxx(1~4位十六进制数,表示对应Unicode字符),\0(ASCII码值为0的空字符)

2024-06-01 16:48:00 377

原创 html期末复习速览

文本或图像火星

2024-05-31 00:58:07 952

原创 java抽象类,接口,枚举练习题

【代码】java抽象类,接口,枚举练习题。

2024-05-24 23:51:55 333

原创 java抽象类和接口知识总结

所以要想使用父类里的东西,那么它的访问权限符肯定不能是private,那不然子类怎么去实现父类的抽象方法,就相当于一个人把遗产设置为private私人的,活的时候这遗产谁都不给用,那么他就算是死了,这遗产也要连着他一起都烧了,那还怎么让子孙去继承这个遗产,所以不能用private修饰抽象类(用重写规则里的“子类重写方法的访问权限不能比父类中被重写方法的访问权限更低”也说得通,因为private是最低的访问权限了,没有比private更低的访问权限了)修饰类,表示此类不能被继承;那么它存在的意义是什么呢?

2024-05-24 23:40:59 1288

原创 java继承中执行构造方法的顺序

分析:首先一切都是从main里第一条语句开始,new Derived("C"),然后跳到public Derived(String s),因为类牵扯到继承,要先将父类初始化,所以必须要有super,但是我们写了Derived的有参构造方法,所以系统不会给我们写无参的构造方法,同时父类的构造方法public Base(String s)是有参的,有参是不能不写的,所以在public Derived(String s)里面必须得有super(形参),可是我们这里的代码没有super(形参),会编译错误。

2024-05-18 15:24:56 677

原创 java练习题

【代码】java练习题。

2024-05-17 21:09:56 167

原创 整理版:java类与对象知识框架总结(超级详细)

1.我们可以不写任何的构造方法,这时系统会默认帮我们写一个无参的构造方法,但是我们一旦自己写了任何一个构造方法,那么系统就不会帮我们写那个无参的构造方法举个例子:我们不写时,有一个无参构造方法。然后我们写了一个带参的构造方法,这时我们拥有的构造方法只有这个带参的构造方法,无参的那个构造方法就消失了,所以如果我们需要无参的构造方法,我们必须自己给它补上。

2024-05-17 13:16:33 726

空空如也

空空如也

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

TA关注的人

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