自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 post请求

nginx收到 HTTP 请求报文后(如果配置了upstream,会根据负载均衡算法选择一个后端服务器),根据配置文件中的location块来匹配请求的URL。浏览器收到 HTTP 响应报文后,根据 HTML 中的其他资源的 URL,再次发起 HTTP 请求,直到网页完全加载显示。nginx转发请求到后端服务器,后端服务器处理请求,返回HTTP响应报文给nginx,nginx将响应发送给游览器。浏览器在不需要和服务器通信时,可以主动关闭 TCP 连接,或者等待服务器的关闭请求。

2024-08-26 18:20:36 464

原创 mysql主从同步

使用的ip地址。

2024-08-24 23:25:18 1754

原创 rabbitmq镜像集群搭建

用到的ip地址。

2024-08-17 16:06:01 587

原创 redis分片集群搭建

不要在超级管理员下面配置,后面如果遇到权限不足就chmod 777 改权限(但是我改烦就su root了)redis-cli在src下面(/home/soft/redis/redis-7.0.2/src)启动要用超级管理员,集群配置文件要权限,到redis日志里面看。在第二台虚拟机的8101端口设置key-value。再复制一份,改掉里面的端口、日志和集群配置文件。查看进程(多余的进程kill -9 pid)在第一台虚拟机的6379端口获取value。进入交互(-c表示集群模式启动)

2024-08-15 00:11:09 479

原创 算法Day23 | Leetcode455.分发饼干、376. 摆动序列、53. 最大子序和

贪心,如果是有下平下[1,2,2,0],所以要包含等于0的情况;如果是下平平上[1,2,2,3]就不能每次都更新pre,只有遇到波峰波谷的时候再去更新,一开始len=1是当含有两个元素的时候,外面定义了pre=0但是应该算有两个连续子序列。贪心,如果当前cur已经小于0了,那对后面的元素都算是削弱,所以重新置为0。

2024-07-29 10:38:13 194

原创 算法Day22 | Leetcode491.递增子序列、46.全排列、47.全排列 II、332.重新安排行程、51. N皇后

回溯,做冲突判断的时候,传入当前行当前列,然后第一判断是否发生列冲突,第二往左上角判断是否发现对角线冲突,第三往右上角判断是否发现对角线冲突。如果不冲突,就将棋盘该位置换成Q,然后将该层转成字符串加入路径集,回溯的时候记得从路径集删除,并且将Q从棋盘中换回.回溯,根据目的地做字母排序。跟全排列同理,从0往后找,找出发地与上一个目的地相同的并且没有使用过的,加入路径集。但是可能出现:1层:4;回溯,与子集不同的是,全部元素都要加进去,不能每次进入函数就将路径集加入结果集。举个例子:1层:4;

2024-07-28 20:22:01 387

原创 算法Day21 | Leetcode93.复原IP地址、78.子集、90.子集II

回溯,因为元素变得可重复了,所以为了保证组合不重复,将数组做排序(同样的,如果当前元素跟前一个元素相同,并且前一个元素处于未使用状态,说明这两情况相同(而非是同时取两个的情况),continue跳过),跟上面不一样,上面不重复所以不排序,从0开始循环,但是这题排了序了,那就以startIndex往后,不然就出现重复组合了。回溯,确定返回条件(1.只能打四个点 2.题目给了是0-255),且题目说了,第一个数字是0的话后面必须打点(即continue),正常回溯划分就行。

2024-07-28 18:56:48 360

原创 算法Day20 | Leetcode39. 组合总和、40.组合总和II、131.分割回文串

排序后,当前元素如果与前一个元素相同,并且前一个元素没有处于被使用状态,那就continue【因为我们取元素是往后取的,前一个元素没有被使用就相当于,当前元素的组合肯定和前一个元素组合相同,不是两个元素同时取的情况】)回溯,与上面不同的是,传的是固定的数组,但是这里传的是分割后的字符串,是一直在改变的,把startindex看作是隔板,一直划分。回溯,同一个元素可以重复取,那调用的时候就传自己进去。数组递增,所以当加起来的和大于target就可以返回了。

2024-07-28 18:46:06 352

原创 算法Day19 | Leetcode77.组合优化、216.组合总和III、17.电话号码的字母组合

回溯,如果不剪枝的话i<=n就可以了。有个坑就是往result里面加路径的时候,不能直接加path,它是引用,后面修改的话会把path也给修改的,所以要重新new一个往里放。对获取到的电话号码做回溯,遍历每个号码对应的字母,字典里面空两个字符串出来到时候直接用下标获取就不用做转换。也是回溯,跟上面基本上一模一样。

2024-07-24 11:12:57 342

原创 算法Day18 | Leetcode669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

右中左遍历,一开始想把累加量放在参数里面,但是在往下的过程中就累加上了。然后想把每个节点的值累加完以后再返回,但是这样做左子树接收不到值,所以把变量定义在全局。[力扣链接]https://leetcode.cn/problems/trim-a-binary-search-tree/)和之前根据前中后序遍历一样,划分数组构建树(在取中间节点的时候忘了加left导致我的右子树有问题)前序遍历,遇到需要保留的节点就正常递归,遇到需要改变结构的就将接下来要递归的节点替代掉该节点。

2024-07-23 14:27:03 186

原创 算法Day17 | Leetcode235. 二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

如果要删的是叶子节点,返回null就行;如果左有右空,返回左,如果左空右有,返回右;如果左右都不为空,要将左子树嫁接到右子树的最右下角的叶子节点(右边的每个都比左边大,右边最小的就是最左下角的)前序遍历从上往下找,因为二叉搜索树,所以公共祖先肯定是在[p,q]之间的。如果当前的节点比pq都大,那就往左找;都小往右,如果都不满足,说明就是在pq之间,返回当前节点。二叉搜索树有顺序,前序遍历从上往下找。

2024-07-22 16:02:55 344

原创 算法Day16 | Leetcode530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先

后序遍历从下往上找,对于当前节点,如果左右都有结果,说明左右都找到了,这个节点就是公共祖先。但是如果左有右空,有两种情况,两个都在左边(即该节点和该节点的左节点就是要找到那两个)或者左找到了右没找到,但是不管是什么情况,继续往上抛,告诉上面得节点左边有找到,上面接收到左的结果,往右找,抛到最上面,也是两种结果,左有右空,这就说明两个都在左,但是一开始就把结果一直往上抛了,所以最近公共祖先没有变动。一开始想遍历整棵树,维护HashMap。二叉搜索树,中序遍历就是按序排列(1,2,3)计算两两最小值。

2024-07-22 14:11:55 294

原创 算法Day15 | Leetcode654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

中序遍历,把遍历结果写下来可以发现它是递增的。记录前一个的节点,判断是否大于前一个节点。前序遍历,找到数组中的最大值,记录划分左右子树的起始下标和终止下标,坚持左闭右开。前序遍历,创建节点。遍历完后给节点赋值左右节点。判断是否符合条件,以及往左还是往右遍历。

2024-07-19 14:56:03 177

原创 算法Day14 | Leetcode513.找树左下角的值、112. 路径总和、106.从中序与后序遍历序列构造二叉树

用找所有路径的方法,计算总和是否是target。同样是前序遍历,可以减去target值,最后返回target值是否为0的判断。确定好中间节点,记录划分左右子树的起始节点和终止节点,坚持左闭右开(不然就要踩坑了。

2024-07-19 14:39:42 316

原创 算法Day13 | Leetcode110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和、222.完全二叉树的节点个数

前序遍历,利用List存储路径(方便回退),进来就存路径里,我们找到的路径不包含空节点,所以要对终止条件做限制。当到达终止条件时,将路径存到结果集里。这里不能用层序遍历,因为最左边的节点不一定是叶子节点。后序遍历,当左节点不为空,并且左节点为叶子节点时,值加入到总和中。后序遍历,计算到该节点的最大高度,判断左右子树相减是否大于1,接收子树的判断结果,如果false直接返回不用做判断了。层序遍历或者后序遍历都可以。

2024-07-19 14:28:08 241

原创 算法Day12 | Leetcode226.翻转二叉树、101. 对称二叉树、104.二叉树的最大深度、111.二叉树的最小深度

分成左右两个子树,左子树向左的时候右子树向右,左子树向右的时候右子树向左。后序遍历,从下往上获取该节点的最小高度,到最后即root的最小深度。层序遍历(递归迭代都行)后续遍历,交换左右节点。

2024-07-19 14:08:44 330

原创 算法Day11 || 二叉树的递归遍历、层序遍历

借助队列记住每层总共有多少个,这样就知道在下一层应该从队列中弹出多少个元素并把它左右节点入队。

2024-07-19 13:52:24 275

原创 算法Day10 | Leetcode150. 逆波兰表达式求值、239. 滑动窗口最大值、347.前 K 个高频元素

比较需要注意的是是第二个弹出的元素对第一个弹出的元素做运算,所以循环是从后往前赋值,加减乘除就都通用了。3.一定要是单调的(踩了不是单调的坑),一开始我是用单端队列来写的,但是出现了3,1,2这种情况,1、2均比3小,均入队,但是当3出窗口,1成了队头,但是实际上2大,所以才强调单调递减,改用双端队列。我们选择逐渐递增(即队头是小的),因为我们在后面入队的时候,需要将小的拿出来,大的放进去。2.如果是递增的话就没必要,因为后一个元素比前一个元素大的话,前面的元素怎么都不可能成为窗口最大值了。

2024-07-14 00:42:18 293

原创 算法Day9 | Leetcode232.用栈实现队列、225. 用队列实现栈、20. 有效的括号、1047. 删除字符串中的所有相邻重复项

将要加入的元素先放进辅助队列,然后再将模拟栈的队列的元素移到辅助队列上,这样就能保持加入的最新的元素是在队头(即栈顶),然后此时模拟栈的队列为空,将模拟栈的队列和辅助队列交换(如果要保持加入的元素出现在队头,那个队列就得是空的),模拟栈的队列的队头出队。有两个栈,当需要弹栈的时候把第一个栈的元素放到第二个栈中,这样第二个栈的栈顶就是原来第一个栈的栈底,把第二个栈栈顶元素弹出即可。后面再加元素的时候往第一个栈加,不影响我弹栈的时候弹第二个栈(已经顺序了),当第二个栈空了以后,再将第一个栈的元素压入第二个栈。

2024-07-12 16:34:53 438

原创 使用EasyExcel导入导出数据

我一开始分割用户列表的时候,用的ArrayList去接收,但是发现会报错。后面点进去看了一下,发现它内部不是建了一个ArrayList返回,而是它自己的内部类SubList,所以它虽然返回了个List但是要清除实际上是SubList,如果对分割后的列表进行改动的话,会影响到原列表。但是等了十分钟都没搞好。整体用了八分钟,其中造50w条数据竟然用了六分钟。发现了一个事情,数据早就插入数据库成功了,但是控制台只有Mapper插入相关的日志,没有System.out.println()的输出。

2024-07-11 23:20:51 1417

原创 算法Day8 | Leetcode151.翻转字符串里的单词、右旋字符串(acm模式)、实现 strStr()

跟链表的删除倒数第K个元素一个思想。先让fast指针走k步,slow和fast再一起走。记得输入的时候吞掉一个回车符。去掉多余的空白字符,拆分字符串,逆序拼接。还有种写法就是去掉多余空白字符,全反转,按每个空白字符划分再反转一次。

2024-07-11 13:51:42 176

原创 算法Day7 | Leetcode344.反转字符串、541. 反转字符串II、替换数字(acm模式)

拼接字符串,注意判断那个0和9要加单引号。但是我看到别的解法是通过Character.isDigit()来判断数字个数然后创建相应大的数组。暴力求解写崩溃了^^最关键的点还是在于右边界是通过长度和目前所在位置走k个看谁要更小来界定。

2024-07-10 10:59:29 316

原创 CompletableFuture应用

在语言模型中,编码器和解码器都是由一个个的 Transformer 组件拼接在一起形成的。提供先进的推理,复杂的指令,更多的创造力。

2024-07-09 18:17:08 247

原创 算法Day6 | Leetcode454题.四数相加II、383. 赎金信、15.三数之和、18. 四数之和

这个相比于三数之和是在外面多一层循环,以外面两层循环为结果来双指针查找是否存在满足target的组合。这里如果需要剪枝的话可以通过判断nums[i]大于0且比target大来写,但是时间复杂度是没有变的。比较需要注意的就是去重,是下标i和下标i-1相等的时候跳,如果是和下标i+1相等的时候跳的话,会漏掉结果,比如{-1,-1,2}也是一种结果,但是上面的判断条件会漏。因为只需要返回满足条件的个数,无需关注下标只用关注结果,分成两组,算AB的和的集合,再去算CD的和,用零减去和判断在AB集合里面是否存在。

2024-07-09 14:16:21 260

原创 算法Day5 | Leetcode242.有效的字母异位词、349. 两个数组的交集、202.快乐数、1. 两数之和

一开始想的是遍历数组,维护Map,判断是否出现了target减去当前数,有就是有解。我在存数字的时候存的是最后一次出现的,我在找答案遍历数组是从前往后遍历,找到的是第一次出现的。一开始没有看到下面的提示,数组大小和存的数字是有范围的,所以用了Set来维护。需要注意的地方就是数组大小不是有提示里的length决定的,还是由存取的数字决定的。因为需要判断一个元素的出现次数,所以想到了用哈希法。题目中加粗标记了会出现无限循环,且n很大就不拿数组维护了,用Set维护,如果出现过,说明循环了不是快乐数,直到出现1。

2024-07-08 11:13:03 291

原创 算法Day4 | Leetcode24.两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II

但是自己写的时候出现了一个错误,就是我以为直接改变指针指向会把两个链表拼在一起(因为题目说了不能改变原始结构),但其实没有做.next指向是没有问题的。一开始想的是翻转链表,正向删除节点,删除后再翻转回来,但是需要考虑的边界值比较麻烦。处理链表双指针/递归,所以第二次就试着用双指针来解(涉及到增删改考虑虚拟节点)用双指针,快的那个一步步追赶慢的。快慢指针的交点和从头出发的指针一步步往前,遇到的点就是环的起点。但是照着两两一组的思路,做链表反转,然后再把断开的地方连接起来就可以了。

2024-07-06 16:20:30 413 1

原创 算法Day3 | Leetcode203.移除链表元素、707.设计链表、206.反转链接

【代码】算法Day3 | Leetcode203.移除链表元素、707.设计链表、206.反转链接。

2024-07-05 11:23:19 207

原创 自定义注解

RetentionPolicy.RUNTIME:运行时保留策略表示注解会被保留到运行时,编译器会将注解信息包含在编译后的 class 文件中,并且 JVM 加载类时会将这些注解加载到内存中,因此可以通过反射在运行时获取这些注解的信息。RetentionPolicy.RUNTIME表示注解会被保留到运行时,这样我们就可以通过反射来获取注解信息。RetentionPolicy.SOURCE:源代码级别保留策略表示注解只会保留在源代码中,编译器会丢弃这些注解,不会包含在编译后的 class 文件中。

2024-07-04 17:52:26 1538

原创 算法Day2 | LeetCode977有序数组的平方、209长度最小的子数组、59螺旋矩阵Ⅱ

这里我用的是左闭右开的区间。然后确定好圈数以及每圈起始和终止位置(这里我在写从右到左,从下到上的方向时就没确定好终止条件,出现了第二圈覆盖),以及如果是奇数的话矩阵中心应该怎么处理。数组是有序递增的,负数平方以后可能会比前面的大,但是最大的数一定是在两端,并且往中间递减。找到的子数组是连续的,所以采用滑动窗口的方法,需要注意的是大于等于target而不仅仅是等于target。我发现好像会说非递减顺序的数组来代替说递增数组,所以看到的时候确认一下是不是说了不是连续数组。

2024-07-04 15:00:39 381

原创 拦截器应用

拦截器我觉得是AOP的一种应用,在请求调用前后会经过拦截器。postHandle():处理方法后,视图渲染前。afterCompletion():视图渲染后。拦截器的处理顺序是按照注册的先后顺序来。preHandle():处理方法前。

2024-07-04 11:36:56 256

原创 算法Day1 (数组)| LeetCode704二分查找、27移除元素

二分查找适用有序、元素不重复的数组(必须满足这两点)需要对数组原地做改变的可以考虑用双指针。

2024-07-04 00:01:45 217

空空如也

空空如也

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

TA关注的人

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