自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 SSO 单点登录

单点登录的英文名叫做:Single Sign On(简称SSO),指在同一帐号平台下的多个应用系统中,用户只需登录一次,即可访问所有相互信任的系统。简而言之,多个系统,统一登陆。类似之前实习的时候,平台只要登录一次就可以访问其他内部平台为什么需要做单点登录系统呢?在一些互联网公司中,公司旗下可能会有多个子系统,每个登陆实现统一管理,多个账户信息统一管理 SSO单点登陆认证授权系统。比如阿里系的淘宝和天猫,显而易见这是两个系统,但是在使用过程中,只要你登录了淘宝,同时也意味着登录了天猫。

2024-03-16 17:02:08 705

原创 设计模式笔记

⼯⼚⽅法模式使得每个⼯⼚类的职责单⼀,每个⼯⼚只负责创建⼀种产品,当创建对象涉及⼀系列复杂的初始化逻 辑,⽽这些逻辑在不同的⼦类中可能有所不同时,可以使⽤⼯⼚⽅法模式将这些初始化逻辑封装在⼦类的⼯⼚中。但是如果有多类产品 呢,⽐如说“⼿机”,⼀个品牌的⼿机有⾼端机、中低端机之分,这些具体的产品都需要建⽴⼀个单独的⼯⼚类,但 是它们都是相互关联的,都共同属于同⼀个品牌,这就可以使⽤到【抽象⼯⼚模式】。简单⼯⼚模式的核⼼思想是将产品的创建过程封装在⼀个⼯⼚类中,把创建对象的流程集中在这个工厂类里面。

2024-03-15 19:02:17 1729

原创 Java数据类型api记录

entrySet是java中 键-值对的集合,Set里面的类型是Map.Entry,一般可以通过map.entrySet()得到。还有一种是keySet, keySet是键的集合,Set里面的类型即key的类型。3. 通过Map.values()遍历所有的value,但不能遍历key。Java中可以使用Arrays类的sort()方法对数组进行排序。set 转为数组 也就老老实实一个个填吧!数组转为set 就老老实实遍历吧!当然可以使用更加高级的stream流。常用方法 数组转为Set。

2024-03-09 16:31:39 338

原创 有关JSON的处理

FastJson 是阿里巴巴的开源JSON解析库,它可以解析 JSON 格式的字符串,支持将 Java Bean 序列化为 JSON 字符串,也可以从 JSON 字符串反序列化到 JavaBean。

2023-08-13 11:56:06 373

原创 Java Stream流

中间方法:filter、limit、skip、distinct、concat、map。使用默认方法stream()生成流, default Stream<E> stream()中间操作的意思是,执行完此方法之后,Stream流依然可以继续执行其他操作。终结操作的意思是,执行完此方法之后,Stream流将不能再执行其他操作。对数据使用Stream流的方式操作完毕后,可以把流中的数据收集到集合中。单列集合:Collection中的默认方法stream。一堆零散的数据: Stream接口中的静态方法of。

2023-08-12 14:47:51 179

原创 Java创建线程的几种方法

创建Runnable实现类的实例,并将其作为Thread的target来创建Thread对象,Thread对象为线程对象。定义Runnable接口的实现类,并实现该接口的run()方法,该run()方法将作为线程执行体。定义Thread类的子类,并重写该类的run()方法,该run()方法将作为线程执行体。创建Thread子类的实例,即创建了线程对象。调用线程对象的start()方法来启动该线程。调用线程对象的start()方法来启动该线程。

2023-07-04 20:41:24 201

原创 Leetcode 刷题 动态规划

t[j - 1]),此时相当于t要删除元素,t如果把当前元素t[j - 1]删除,那么dp[i][j] 的数值就是 看s[i - 1]与 t[j - 2]的比较结果了,即:dp[i][j] = dp[i][j - 1];当s[i - 1] 与 t[j - 1]不相等时,dp[i][j]只有一部分组成,不用s[i - 1]来匹配(就是模拟在s中删除这个元素),即:dp[i - 1][j]dp[i][j]:以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为dp[i][j]。

2023-07-03 09:54:35 268

原创 Leetcode 刷题 动态规划

如果text1[i - 1] 与 text2[j - 1]不相同,那就看看text1[0, i - 2]与text2[0, j - 1]的最长公共子序列 和 text1[0, i - 1]与text2[0, j - 2]的最长公共子序列,取最大的。dp[i][j]:长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长公共子序列为dp[i][j]即:dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);和上面那一题的解题思路一致。

2023-07-01 11:15:08 278

原创 Leetcode 刷题 动态规划 子序列问题

dp[i][j] :以下标i - 1为结尾的A,和以下标j - 1为结尾的B,最长重复子数组长度为dp[i][j]每一个i,对应的dp[i](即最长递增子序列)起始大小至少都是1.子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。1. 确定dp数组(dp table)以及下标的含义。不一定要连续 可以删除部分元素 但是要保证相对顺序。题目中说的子数组,其实就是连续子序列。3. dp[i]的初始化。1. dp[i]的定义。这题难度一下子就小了。本题也可以用贪心来做。

2023-06-30 10:03:02 207

原创 设计模式GOF

具体地说,就是把所有子类通用的信息和行为抽象出来放在父类中,建立抽象方法或非抽象的通用方法,然后由子类去继承和实现。下面我以[上数学课]和[上英语课]为例,展示模板方法模式的代码实现。

2023-06-29 19:34:08 416

原创 Leetcode 刷题 动态规划

即:dp[i][2] = dp[i - 1][0] + prices[i];,本题只需要在计算卖出操作的时候减去手续费就可以了,代码几乎是一样的。昨天一定是持有股票状态(状态一),今天卖出。1. 确定dp数组以及下标的含义。昨天卖出了股票(状态三)

2023-06-29 09:45:45 222

原创 RabbitMQ

应用场景一:缩短调用时间同步处理:1、注册信息写入数据库;2、发送注册邮件;3、发送注册短信 150S异步处理【需要等待返回】:1、注册信息写入数据库;异步发送: 2、发送注册邮件 + 发送注册短信 100S消息队列【不需要等待返回】:1、注册信息写入数据库;写入队列:异步读取 2、发送注册邮件;3、发送注册短信 50S【因为 发送邮件+发送短信 不需要等待返回】

2023-06-28 20:11:16 1833

原创 Leetcode 刷题 动态规划

一定是选最大的,所以 dp[i][1] = max(dp[i-1][0] - prices[i], dp[i - 1][1]);所以 dp[i][2] = max(dp[i - 1][1] + prices[i], dp[i - 1][2])dp[i][j]中 i表示第i天,j为 [0 - 4] 五个状态,dp[i][j]表示第i天状态j所剩最大现金。使用二维数组 dp[i][j] :第i天的状态为j,所剩下的最大现金是dp[i][j]达到dp[i][1]状态,有两个具体操作。一天一共就有五个状态,

2023-06-28 09:50:05 228

原创 登录模块笔记

在存入session时jsessionid的作用域提升至最大.比如auth.gulimall.com->.gulimall.com,那么gulimall.com及其下面的所有子域名都可以拿到这个jsessionid,然后再去redis中查询对应的session信息,可以实现不同服务之间的session共享。相同服务之间的session共享使用,session存入redis即可解决问题,相同服务的域名是相同的jsessionid也是相同的。不同服务,Session不能共享,子域Session 共享问题。

2023-06-27 21:08:59 43

原创 异步 线程池

在 Java 8 中, 新增加了一个包含 50 个方法左右的类: CompletableFuture, 提供了非常强大的Future 的扩展功能, 可以帮助我们简化异步编程的复杂性, 提供了函数式编程的能力, 可以通过回调的方式处理计算结果, 并且提供了转换和组合 CompletableFuture 的方法。线程池的线程数量不确定,但若有空闲线程可以复用,则会优先使用可复用的线程。因为线程池中的线程数没有超过线程池的最大上限时,有的线程处于等待分配任务的状态,当任务来时无需创建新的线程就能执行。

2023-06-27 19:12:54 36

原创 Leetcode 刷题 动态规划

上一题因为股票全程只能买卖一次,所以如果买入股票,那么第i天持有股票即dp[i][0]一定就是 -prices[i]。基础都是要从dp[0][0]和dp[0][1]推导出来。如果第i天持有股票即dp[i][0], 那么可以由两个状态推出来。如果第i天不持有股票即dp[i][1], 也可以由两个状态推出来。dp[i][0] 表示第i天持有股票所得最多现金。dp[i][1] 表示第i天不持有股票所得最多现金。dp[i][0] 表示第i天持有股票所得最多现金。dp[i][1] 表示第i天不持有股票所得最多现金。

2023-06-27 09:39:57 288

原创 Nginx笔记

正向代理是一个位于客户端和原始服务器之间的代理服务器,为了从原始服务器取得内容,客户端向代理服务器发送一个请求并指定目标原始服务器。当请求过多,单个服务器难以负荷时,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上。客户端向反向代理的命名空间中的内容发送普通请求,接着反向代理将推断向何处(原始服务器)转交请求,并将获得的内容返回给客户端。Nginx反向代理给网关的时候 会丢失请求的host的信息(实际上不止这一个)主要是配置server块。

2023-06-26 21:39:34 196

原创 Redis笔记

死锁问题:说的是锁没有被动过期时间,即拿到了锁,但是在执行业务过程中,程序崩溃了,锁没有被正常释放,导致其他线程无法获取到锁,从而产生死锁问题。之前的解决方式:set nx ex命令锁被其他人释放问题:第一条线程抢到锁,业务执行超时,第一条线程所持有的锁被自动释放;此时第二条线程拿到锁,准备执行业务,刚好第一条线程业务执行完成,照常执行了释放锁的过程,导致第二条线程持有的锁被第一条线程所释放,锁被其他人释放。之前的解决方式:给锁一个唯一值(UUID),每次解锁前进行判断原子性操作。

2023-06-26 19:16:41 1409

原创 Leetcode 刷题 动态规划

递推公式的基础就是dp[0] 和 dp[1]。从dp[i]的定义上来讲,dp[0] 一定是 nums[0],dp[1]就是nums[0]和nums[1]的最大值即:dp[1] = max(nums[0], nums[1]);dp数组(dp table)以及下标的含义:下标为0记录不偷该节点所得到的的最大金钱,下标为1记录偷该节点所得到的的最大金钱。dp[i] 是根据dp[i - 2] 和 dp[i - 1] 推导出来的,那么一定是从前到后遍历。这题想法很巧妙 有点像 分而治之?3. dp数组如何初始化。

2023-06-26 11:10:23 118

原创 Spring SpringMVC Mybatis Springboot

Spring 包含了多个功能模块,其中最重要的是 Spring-Core(主要提供 IoC 依赖注入功能的支持) 模块, Spring 中的其他模块(比如 Spring MVC)的功能实现基本都需要依赖于该模块。AspectJ:本质上是静态代理,将代理逻辑“织入”被代理的目标类编译得到的字节码文件,所以最终效果是动态的。1.从目标对象中,把非核心业务代码(横切关注点)抽离出来(抽离出横切关注点), 并放入切面(就是一个类)中,封装每一个横切关注点为通知(就是封装为一个方法)。这就需要使用动态代理技术了。

2023-06-25 18:20:55 141

原创 Leetcode 刷题 动态规划

单词就是物品,字符串s就是背包,单词能否组成字符串s,就是问物品能不能把背包装满。可以通过set.contains() 来判断set集合中是否有出现指定的字符串。拆分时可以重复使用字典中的单词,说明就是一个完全背包!因为有重复 所以先放入Set集合去重。这里其实是求排列 所以需要。

2023-06-25 10:37:38 67

原创 Leetcode 刷题 动态规划

首先凑足总金额为0所需钱币的个数一定是0,那么dp[0] = 0。考虑到递推公式的特性,dp[j]必须初始化为一个最大的数。题目中说每种硬币的数量是无限的,可以看出是典型的完全背包问题。所以本题并不强调集合是组合还是排列。1.确定dp数组以及下标的含义。3. dp数组如何初始化。5. 举例推导dp数组。

2023-06-24 17:12:31 67

原创 Leetcode 刷题 动态规划

有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大完全背包和01背包问题唯一不同的地方就是,每种物品有无限件 例子: 背包最大重量为4。物品为: 每件商品都有无限个!问背包能背的物品最大价值是多少? 01背包和完全背包唯一不同就是体现在遍历顺序上01背包的核心代码01背包内嵌的循环是从大到小遍历,为了保证每个物品仅被添加一次。而完全背包的物品是

2023-06-24 13:28:49 50

原创 Leetcode 刷题 动态规划

从递推公式可以看出,在初始化的时候dp[0] 一定要初始化为1,因为dp[0]是在公式中一切递推结果的起源。只要搞到nums[i],凑成dp[j]就有dp[j - nums[i]] 种方法。只不过这个背包有两个维度,一个是m 一个是n,而不同长度的字符串就是不同大小的待装物品。dp[j] 表示:填满j(包括j)这么大容积的包,有dp[j]种方法。这次和之前遇到的背包问题不一样了,之前都是求容量为j的背包,最多能装多少。其实就是尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小。1.确定dp数组的含义。

2023-06-21 15:48:19 30

原创 Leetcode 刷题 动态规划

在一维dp数组中,dp[j]表示:容量为j的背包,所背的物品价值可以最大为dp[j]。

2023-06-20 17:45:41 30

原创 Leetcode 刷题 动态规划

递推公式:dp[i] += dp[j - 1] * dp[i - j];dp[i] 是依靠 dp[i - j]的状态,所以遍历i一定是从前向后遍历,先有dp[i - j]再有dp[i]。所以递推公式:dp[i] = max({dp[i], (i - j) * j, dp[i - j] * j});看出其递推关系, dp[i] += dp[以j为头结点左子树节点数量] * dp[以j为头结点右子树节点数量]一个是j * dp[i - j],相当于是拆分(i - j)可以想 dp[i]最大乘积是怎么得到的呢?

2023-06-19 19:10:06 21

原创 Leetcode 刷题 动态规划

那么很自然,dp[i][j] = dp[i - 1][j] + dp[i][j - 1],因为dp[i][j]只有这两个方向过来。dp[i - 1][j] 表示从(0, 0)的位置到(i - 1, j)有几条路径,dp[i][j - 1]同理。想要求dp[i][j],只能有两个方向来推导出来,即dp[i - 1][j] 和 dp[i][j - 1]。dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。和上一题差不多 只是增加了障碍。

2023-06-17 18:16:34 24

原创 Leetcode 刷题 动态规划

一定是选最小的,所以dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);因为是模拟台阶,而且dp[i]由dp[i-1]dp[i-2]推出,所以是从前到后遍历cost数组就可以了。只初始化dp[0]和dp[1]就够了,其他的最终都是dp[0]dp[1]推出。当然可以发现,我们只需要维护两个数值就可以了,不需要记录整个序列。1.确定dp数组以及下标的含义。3.dp数组如何初始化。

2023-06-16 10:30:24 25

原创 遇到的概率知识

用统计术语来说,后验概率是假设事件B已经发生的情况下事件A发生的概率。P(AB)——事件A、 B同时发生的概率,即联合概率.联合概率表示两个事件共同发生的概率.A 与 B 的联合概率表示为 P(AB) 或者 P(A,B).条件概率 示例:就是事件A 在另外一个事件 B 已经发生条件下的发生概率.条件概率表示为 P(A|B),读作“在 B 条件下 A 的概率”P(A|B)——在 B 条件下 A 的概率.即事件A 在另外一个事件 B 已经发生条件下的发生概率.P(B)——事件B发生的概率.

2023-06-15 19:12:10 41

原创 Leetcode 刷题 贪心算法

例如:98,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]--,然后strNum[i]给为9,这样这个整数就是89,即小于98的最大的单调递增整数。Integer.parseInt()和Integer.valueOf()都是将成为String转换为Int。Integer.valueOf(),返回的是封装的Integer对象。Integer.parseInt(),返回一个原子类型int。基本数据类型不具备方法和属性。

2023-06-15 11:16:10 24

原创 Leetcode 刷题 贪心算法

在遍历 到遍历到当前字母最远下标的时候 也就找到了分割点。当 当前的区间的左边界 小于 前一个区间的右边界的时候。所以先需要遍历 找到一个字母 出现的最远下标。注意审题 同一字母最多出现在一个片段中。说明发生了重叠 一定需要移除一个区间。还是一样 需要先按照左边界先排序。如果出现重叠 就更新边界。

2023-06-14 11:14:19 24

原创 Leetcode 刷题 贪心算法

局部最优:遇到账单20,优先消耗美元10,完成本次找零。全局最优:完成全部账单的找零。局部最优:当气球出现重叠,一起射,所用弓箭最少。全局最优:把所有气球射爆所用弓箭最少。先按照第一个维度逆序排序 如果第一个维度相同 那就按照第二个维度进行排序。遇到两个维度权衡的时候,一定要先确定一个维度,再确定另一个维度。其次 LinkedList 的add方法。

2023-06-13 19:11:39 24

原创 Leetcode 刷题 贪心算法

i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,因为这个区间选择任何一个位置作为起点,到i这里都会断油,那么起始位置从i+1算起,再从0计算curSum。那么又是一个贪心:局部最优:只找数值最小的正整数进行反转,当前数值和可以达到最大(例如正整数数组{5, 3, 1},反转1 得到-1 比 反转5得到的-5 大多了),全局最优:整个 数组和 达到最大。局部最优:让绝对值大的负数变为正数,当前数值达到最大,整体最优:整个数组和达到最大。

2023-06-12 11:40:03 50

原创 Leetcode 刷题 贪心算法

如果移动下标达到了当前这一步的最大覆盖最远距离了,还没有到终点的话,那么就必须再走一步来增加覆盖范围,直到覆盖范围覆盖了终点。局部最优:当前可移动距离尽可能多走,如果还没到终点,步数再加一。整体最优:一步尽可能多走,从而达到最小步数。

2023-06-11 19:32:38 41

原创 Leetcode 刷题 贪心算法

针对以上情形,result 初始为 1(默认最右面有一个峰值),此时 curDiff > 0 && preDiff <= 0,那么 result++(计算了左面的峰值),最后得到的 result 就是 2(峰值个数为 2 即摆动序列长度为 2)从代码角度上来讲:遍历 nums,从头开始用 count 累积,如果 count 一旦加上 nums[i]变为负数,那么就应该从 nums[i+1]开始从 0 累积 count 了,因为已经变为负数的 count,只会拖累总和。是数组中的一个连续部分。

2023-06-09 16:57:44 22

原创 Leetcode 刷题 回溯算法

可以看出,二维矩阵中矩阵的高就是这棵树的高度,矩阵的宽就是树形结构中每一个节点的宽度。一开始不知道怎么构建一个棋盘。第一次做这种棋盘的题目。其实就是一个二维数组。

2023-06-08 18:47:52 93

原创 Leetcode 刷题 回溯算法

可以看出元素1在[1,2]中已经使用过了,但是在[2,1]中还要在使用一次1,所以处理排列问题就不用使用startIndex了。也可以使用ArrayList 中的 contains方法。这题还是同一树层不能重复取 但是 同一树枝可以重复取。,排完序的数组都是自增子序列了。可以使用数组 或者 map 去重。是不能对原数组进行排序的。

2023-06-07 13:31:17 27

原创 Leetcode 刷题 回溯算法

其实子集也是一种组合问题,因为它的集合是无序的,子集{1,2} 和 子集{2,1}是一样的。如果把 子集问题、组合问题、分割问题都抽象为一棵树的话,子集问题某种程度上和组合问题类似 是无序的。还是一样 子集问题 是收集递归树的所有节点。同一层不能重复取 但是 同一树枝可以重复取。也可以使用一个used数组来判断。那么关于回溯算法中的去重问题,回溯算法 同一树层的去重逻辑。这题涉及到去重的逻辑。

2023-06-06 11:23:41 26

原创 Leetcode 刷题 回溯算法

为什么 used[i - 1] == false 就是同一树层呢,因为同一树层,used[i - 1] == false 才能表示,当前取的 candidates[i] 是从 candidates[i - 1] 回溯而来的。因为本地可以使用重复的元素 单层for循环依然是从startIndex开始,搜索candidates集合。这里直接用startIndex来去重也是可以的, 就不用used数组了。,用来记录同一树枝上的元素是否使用过。这个集合去重的重任就是used来完成的。

2023-06-05 12:22:19 24

原创 Leetcode 刷题 回溯算法

这里使用一个全局的map来存放数字和字母的对应关系。组合问题 去重 使用下标 startIndex。这题不难 主要是怎么构造出数字键盘。主要是一个Java封装的方法的使用。简单题 和之前的组合 类似。

2023-06-03 14:38:00 24

空空如也

空空如也

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

TA关注的人

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