给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。
题目描述:你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。
在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课程 bi 。
例如,先修课程对 [0, 1] 表示:想要学习课程 0 ,你需要先完成课程 1 。
请你判断是否可能完成所有课程的学习?如果可以,返回 true ;否则,返回 false 。
示例 1:
123输入:numCourses = 2, prerequisites = [[1,0]]输出:true解释:总共有 2 门课程。学习课程 1 之前,你需要完成课程 0 。这是可能的。
示例 2:
123输入:numCourses = 2, prerequisites = [[1,0],[0,1]]输出:false解释:总共有 2 门课程。学习课程 1 之前,你需要 ...
**Trie**(发音类似 “try”)或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补全和拼写检查。
请你实现 Trie 类:
Trie() 初始化前缀树对象。
void insert(String word) 向前缀树中插入字符串 word 。
boolean search(String word) 如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);否则,返回 false 。
boolean startsWith(String prefix) 如果之前已经插入的字符串 word 的前缀之一为 prefix ,返回 true ;否则,返回 false 。
示例:
1234567891011121314输入["Trie", "insert", "search", "search", "startsWith", "insert", "search"][ ...
在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一:
值 0 代表空单元格;
值 1 代表新鲜橘子;
值 2 代表腐烂的橘子。
每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。
返回 直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1 。
示例 1:
12输入:grid = [[2,1,1],[1,1,0],[0,1,1]]输出:4
示例 2:
123输入:grid = [[2,1,1],[0,1,1],[1,0,1]]输出:-1解释:左下角的橘子(第 2 行, 第 0 列)永远不会腐烂,因为腐烂只会发生在 4 个方向上。
示例 3:
123输入:grid = [[0,2]]输出:0解释:因为 0 分钟时已经没有新鲜橘子了,所以答案就是 0 。
解法:使用BFS
BFS 可以看成是层序遍历。从某个结点出发,BFS 首先遍历到距离为 1 的结点,然后是距离为 2、3、4…… 的结点。因此,BFS 可以用来求最短路径问题。BFS 先搜索到的结点,一定是距离最近的结点。
再看看这道题的题目要求:返回直到单元格中没有新 ...
给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
示例 1:
1234567输入:grid = [ ["1","1","1","1","0"], ["1","1","0","1","0"], ["1","1","0","0","0"], ["0","0","0","0","0"]]输出:1
示例 2:
1234567输入:grid = [ ["1"," ...
Spring中的@Schedule注解
Spring中的基本概念什么是Spring BeanBean就相当于定义一个组件,这个组件是用于具体实现某个功能的。
在Spring文档的官方解释是:在 Spring 中,构成应用程序主干并由 Spring IoC 容器管理的对象称为 bean。bean 是由Spring IoC 容器实例化、组装和管理的对象。
简单说明一下就是:
bean 是对象,一个或者多个不限定
bean 由 Spring 中一个叫 IoC 的东西管理的
我们的应用程序由一个个 bean 构成
Bean就是Spring当中的最小执行单位
什么是IOCIOC(Inversion of Control,控制反转)Spring IOC它的主要作用是将对象的创建和依赖关系的管理交给 Spring 容器来处理,而不是在代码中手动创建和管理对象。
控制反转通过依赖注入(DI)方式实现对象之间的松耦合关系。程序运行时,依赖对象由辅助程序动态生成并注入到被依赖对象中,动态绑定两者的使用关系。Spring IoC 容器就是这样的辅助程序,它负责对象的生成和依赖的注入,然后再交由我们使用。
通过这种方式,Spring ...
Spring的三级缓存以及循环依赖什么是循环依赖:假设我们有两个类 A 和 B,类A和类B的实例互为成员变量即为循环依赖。
什么情况下会出现死循环?
当 Spring 框架启动后,开始根据注解将类 A 实例化并注入到容器当中,在实例化 A 之后就会尝试获取类 B 的实例来进行依赖注入。
由于类 B 并没有进行实例化,那么 Spring 框架就会去实例化类 B,同样的也会需要将类 A 的依赖注入到类 B 的实例中最终,无论先实例化哪个类,都会形成死循环。
三级缓存是什么①一级缓存:单例池,缓存已经经历了完整的生命周期,已经初始化完成的bean对象
②二级缓存:缓存早期的bean对象(生命周期还没走完)
③三级缓存:缓存的是ObjectFactory,表示对象工厂,用来创建某个对象的
缓存名称
源码名称
说明
一级缓存
singletonObjects
单例池,缓存已经初始化完成的bean对象。
二级缓存
earlySingletonObjects
缓存早期的bean对象。(例如:只进行了实例化,还没有进行依赖注入)
三级缓存
singletonFactories ...
Spring中的@Schedule注解
抽奖整体流程设计 包含前置,中置以及后置规则,有一点类似于Bean对象
为了将代码进行解耦,这里我们需要使用到责任链模式:
责任链模式:职责链模式有时候也叫责任链模式,它是一种对象行为的设计模式。目的是:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。发送请求的客户端并不知道链上的哪个对象会处理这个请求,这使得系统在不影响客户端的情况下动态的组织和分配责任。
这里在装配规则的时候使用到了工厂模式以及责任链模式,因为例如黑名单,白名单,权重计算等都是针对于用户的过滤规则,所以使用责任链模式来判断用户应该应用到的规则。由于不同的策略可能存在一种或者多种规律规则,所以需要使用到了工厂模式来进行创建。
以我的大营销抽奖项目为例子:
Redis 作为缓存主要是为了应对高并发和系统实时性要求。抽奖系统通常有以下几个特点,结合这些需求,我选择 Redis:
1. 高并发处理抽奖活动往往伴随着瞬时的大量用户涌入,比如秒杀、限时优惠等。这时 Redis 的高性能读写能力尤为重要。Redis 可以在内存中快速处理数据,不需要频繁访问数据库,从而减少数据库的压力,并保证抽奖系统在高并发情况下仍然能快速响应。
2. 库存和奖品计数在抽奖过程中,奖品数量是需要精确控制的。使用 Redis 的原子性操作,如 INCR、DECR 等,可以保证每次减少奖品数量的操作是线程安全的,防止多个用户同时中奖时出现超卖、超发的情况。这在并发用户访问时,保证了奖品数量的精确控制。
3. 用户状态管理抽奖活动需要记录用户的参与状态,防止用户重复参与或者超额参与。可以使用 Redis 来存储用户的参与记录,设置过期时间(TTL),这样可以在短时间内快速判断用户是否已经参与过,而不需要每次都查询数据库,提升系统的响应速度。
4. 实时性需求抽奖系统通常有实时开奖或者中奖公告的需求,Redis 的低延迟操作能够满足这类实时性的 ...