- 博客(62)
- 资源 (1)
- 收藏
- 关注
原创 LeetCode第407题:二维接雨水
这个问题是对一维接雨水问题的拓展,引入了二维的高度图。通过利用优先队列,我们能够有效地处理地形的边界和低洼区域,实现动态填充水的过程。这个方法确保了每个位置的水高度是由其最低的边界决定的。
2025-03-04 10:21:26
305
原创 LeetCode 第212题:单词搜索 II
Trie树构建:我们使用Trie树来存储所有需要查找的单词,这样可以高效地进行前缀匹配。深度优先搜索(DFS):在二维网格中,从每个字符开始进行DFS,以查找可能的单词。标记访问:在DFS过程中,将已经访问过的字符标记为特殊符号(如),以避免重复使用。方向搜索:对每个字符进行上下左右四个方向的递归搜索,探索所有可能的路径。结果去重:如果在DFS过程中找到一个完整的单词,将其加入结果列表,并在Trie树中标记为已找到,以防重复加入。恢复状态:在DFS结束后,恢复网格中字符的原始状态,以便其他路径的搜索。
2025-02-27 11:25:12
307
原创 LeetCode 第127题:单词接龙
广度优先搜索(BFS):我们使用BFS来找出从beginWord到endWord的最短转换序列长度。BFS适用于寻找最短路径的问题。使用队列:我们利用队列来实现BFS,队列中保存当前层的所有单词。字符替换:对于当前单词的每个字符,尝试所有可能的字母替换(从'a'到'z'),生成新的单词。字典检查:如果新生成的单词存在于给定的单词列表(转换为集合以加快查找速度)中,我们将其加入队列,并从集合中移除以避免重复访问。层级计数level变量用于记录当前转换的层数,每次处理完一层后递增。终止条件。
2025-02-27 11:22:34
175
原创 LeetCode 25题:K 个一组翻转链表
虚拟头节点:使用一个虚拟头节点简化边界条件的处理,特别是在操作链表头部时。指针操作:使用多个指针来追踪需要翻转的部分和已经翻转的部分。是上一个翻转组的结尾,kthNode找到当前组的结尾。翻转逻辑:在每一组中,使用常规的链表翻转方法进行局部翻转。连接翻转后的部分:在完成一组的翻转后,重新连接翻转后的部分,准备处理下一组。结束条件:如果不足k个节点,直接退出循环,因为不需要翻转。通过这些步骤,我们可以实现每K个节点的翻转操作。
2025-02-26 16:19:11
165
原创 LeetCode 224题:基本计算器
栈的使用:利用栈来存储在括号之前的结果和符号。当遇到右括号时,计算括号内的结果并与栈中的结果结合。符号处理:使用一个sign变量来记录当前的运算符是加还是减。数字处理:当遇到数字时,需要考虑多位数,因此在遇到数字后要继续查看后面的字符是否还是数字。括号处理:当遇到左括号时,将当前的结果和符号存入栈中,并重置当前结果和符号。当遇到右括号时,利用栈中的符号和结果进行更新。通过这些步骤,我们可以处理包含加减法和括号的表达式,正确计算出结果。
2025-02-26 15:04:38
150
原创 LeetCode 76题:最小覆盖子串
LeetCode 76题是“最小覆盖子串”(Minimum Window Substring)。下面是一个Java解题的示例代码,并附上每行的注释。通过这种方法,可以有效地找到字符串。
2025-02-26 10:49:45
315
原创 LeetCode 第 30 题:串联所有单词的子串
在这道题中,你需要在一个字符串中找到所有子串,这些子串由一组单词的串联组成,每个单词的长度相同。
2025-02-20 14:59:34
294
1
原创 LeetCode 68题:文本左右对齐
初始化和准备创建一个结果列表result来存储格式化后的每一行。使用一个索引index来遍历单词列表words。逐行处理单词使用一个循环来填充每一行的单词,直到达到最大宽度maxWidth。对于每一行,首先计算该行可以容纳的单词数量。计算当前行内单词的总长度(包括单词之间的空格)。判断对齐类型左对齐:如果是最后一行,或者当前行只有一个单词,则左对齐:将单词依次加入行中,并在单词之间加入一个空格。用空格填充整行至maxWidth。
2025-02-20 11:16:59
259
原创 LeetCode第135题:分发糖果
LeetCode第135题的要求是分发糖果,给孩子们分配糖果,满足条件是:每个孩子至少一个糖果,评分高的孩子比旁边的孩子多分糖果。这样就能满足题目的条件并找到最小的糖果分配数量。
2025-02-19 17:29:19
183
原创 LeetCode 第 88 题:合并两个有序数组
LeetCode 第 88 题是“合并两个有序数组”。题目要求将两个有序数组合并为一个有序数组,假设第一个数组有足够的空间来容纳第二个数组的所有元素。
2025-02-14 14:57:01
192
原创 JAVA手撕断路器,实现滑动窗口内的失败阈值统计,动态调整是否熔断
通过滑动窗口机制,我们可以更精确地统计失败率,并根据动态的失败率调整熔断状态。这种实现方式适用于高并发场景,能够有效提高系统的稳定性和容错能力。
2025-02-12 11:43:17
375
原创 2、What a Living Whale Is Worth -- and Why the Economy Should Protect Nature _ Ralph Chami _ TED
也许我可以用我们都能理解的语言翻译所有这些价值,他们为我们提供的那些服务。毕竟,鲸鱼是一个生命系统。做出碳零、负碳、碳中和承诺的公司和国家。但我从他们那里学到了一些东西,这真的很不可思议。所以我想,嘿,也许,也许我们可以重视他们的服务。现在,如果您想想象一下 37 亿吨意味着什么,想象一下——因为那些大象正在吸收树木中的碳——想象一下,它只是从我想看到一只蓝鲸的愿望开始。事实上,它们正在死去,因为我们目前的经济体系。但是砍一头鲸鱼,卖掉它的肉,它就获得了价值。RC:它们在陆地上的表亲,非洲森林中的大象,
2024-09-02 22:11:24
1087
原创 1、Why You Feel Anxious Socializing (and What to Do about It) - TED
TED-为什么你对社交感到焦虑每个进入我们治疗诊所的人在开始治疗之前都要回答一堆问题。在我在那里担任治疗师的那些年里,在与新客户会面之前,我总是回顾一个问题。它问这个问题:你的人生目标是什么?被定义为一个核心的激励人生目标,你正在努力实现的目标。现在,公平地说,这是一个难题。确定一个人生目标真的很难。这也感觉很重要。许多人花费数年时间寻找和发展他们的目标,而有些人从未找到。但通常我们会看到这样的回应:成为敬业的父母,在我的社区做出有意义的改变。
2024-08-19 23:06:59
620
原创 JAVA中的AQS介绍
AQS是的缩写,翻译过来是抽象队列同步器。它是 Java 并发编程框架中的一个核心类,用于构建各种同步器,例如锁、信号量、条件变量等。使用一个队列来管理对共享资源的访问。当线程请求访问共享资源时,如果资源空闲,则将线程设置为有效的工作线程,并将资源标记为已占用。如果资源被占用,则将线程加入队列并阻塞,直到资源空闲并被唤醒。AQS 的主要功能包括:线程可以尝试获取锁,如果获取成功,则线程可以访问共享资源。线程释放锁后,其他线程可以尝试获取锁。线程可以等待某个条件满足,例如资源可用或某个事件发生。
2024-03-10 10:40:08
975
原创 redis多线程是啥?
Redis 6.0 引入了多路 I/O 复用技术,可以更有效地处理网络 I/O,从而提高命令执行效率。Redis 的多线程只用于处理网络 I/O 和命令解析,命令执行仍然是单线程顺序执行的。Redis多线程是一种提高Redis性能的有效手段,但需要注意使用时的注意事项。
2024-03-10 10:18:27
400
原创 I/O多路复用select/poll/epoll的区别
I/O多路复用是一种同步的I/O模型,它允许一个进程监视多个文件描述符,并在一个线程中高效地处理来自多个文件描述符的I/O事件。I/O多路复用通过轮询或事件驱动的方式来监视文件描述符。I/O多路复用广泛应用于网络编程、服务器端编程等领域,例如:Linux内核提供了三种I/O多路复用机制:select、poll和epoll都是I/O多路复用技术,用于同时监听多个文件描述符的事件,以便在事件发生时及时响应。它们的主要区别如下:selectCpollCepollC总结select、poll和ep
2024-03-10 10:00:59
1682
原创 Volatile是什么?
概述Volatile 是 Java 中一个非常有用的关键字,用于保证多线程环境下共享变量的可见性和一致性。可见性在多线程环境中,当一个线程修改了共享变量的值时,其他线程可能无法立即看到最新的值。这是因为每个线程都有自己的工作内存,其中包含对共享变量的副本。当一个线程修改共享变量时,只有该线程的工作内存中的副本才会被更新,而其他线程工作内存中的副本仍然是旧的值。Volatile 可以保证所有线程都能看到共享变量的最新值。当一个线程修改了共享变量的值时,JVM 会将该值刷新到主内存中。
2024-03-03 09:35:15
2118
原创 synchronized是什么?底层原理是什么?jdk1.7 和jdk1.8中的synchronized有什么区别?
java synchronized 介绍 使用 底层实现
2024-03-02 22:10:57
1351
原创 ThreadLocal是什么?
是 Java 中一个非常有用的类,它可以为每个线程提供一个独立的变量副本。这意味着每个线程都可以访问和修改自己的变量副本,而不会影响其他线程的变量副本。在多线程环境中传递数据避免线程安全问题简化代码ThreadLocal 内部使用了一个来存储每个线程的变量副本。ThreadLocalMap 是一个哈希表,它将线程 ID 作为键,将变量副本作为值。创建一个 ThreadLocal 变量将值设置到 ThreadLocal 变量中从 ThreadLocal 变量中获取值。
2024-03-02 21:53:02
423
原创 Spring Boot 应用如何优雅关闭
Spring Boot 应用如何优雅关闭,通过Spring Boot Actuator 优雅关闭的底层实现依赖于操作系统提供的多种机制,包括信号机制、线程管理机制、文件管理机制和内存管理机制
2024-03-01 22:39:26
1947
原创 分布式事务及解决方案
分布式事务是指涉及多个节点、服务或数据库的事务操作。在分布式系统中,由于涉及到网络通信、不同节点的数据库等因素,保证 ACID 属性变得更加复杂。分布式事务的目标是确保所有参与者都能够按照一致的方式执行事务,即使在面临网络故障、节点故障等问题时也能保持数据的一致性。为什么会有分布式事务?假设有一个在线购物系统,该系统涉及到多个服务和数据库,包括订单服务、支付服务和库存服务。用户下单时,系统需要确保订单的创建、支付的扣款和库存的减少都是一个原子操作,以保证数据的一致性。
2024-02-24 18:17:30
2009
原创 golang的内存管理的原理,简述go内存管理机制
Go 语言的内存管理机制借鉴了 Google 的 TCMalloc,并结合 Go 语言自身特点进行了优化。
2024-02-23 12:41:57
383
原创 uint型变量值分别为 1,2,它们相减的结果是多少?
这是因为 uint 型变量的取值范围是 0 到 2^n - 1,其中 n 是系统的位数。当 uint 型变量的值超过最大值时,会发生溢出,结果会回绕到最小值。在 Go 语言中,uint 型变量的值是无符号整数。在上面的例子中,2 - 1 的结果是 1,因为 2 已经超过了 32 位 uint 型变量的最大值 4294967295。
2024-02-23 12:23:22
478
原创 Go语言面向对象是如何实现的?
在main()函数中,我们将Animal类型的指针和Dog类型的指针都赋值给了Speaker类型的变量s。结构体可以包含成员变量和成员方法,成员变量默认是私有的,只能在结构体内部访问,成员方法可以是公开的,也可以是私有的。在这个例子中,Dog类型嵌入了一个Animal类型,因此Dog类型拥有Animal类型的所有属性和方法,包括name和Speak()方法。封装是指将数据和方法隐藏在结构体内部,对外只暴露接口,从而实现数据的隐藏和方法的重用。继承是指子类可以继承父类的属性和方法,从而实现代码的重用。
2024-02-21 23:43:01
435
原创 Linux的5种IO模型
非阻塞IO模型与阻塞IO模型类似,但应用程序线程不会被阻塞。在非阻塞IO模型中,当应用程序发起一个IO请求时,如果内核无法立即完成该请求,应用程序线程可以继续执行其他操作,直到内核完成该请求并通知应用程序。阻塞IO模型是最简单的IO模型,也是最常用的IO模型之一。在阻塞IO模型中,当应用程序发起一个IO请求时,如果内核无法立即完成该请求,应用程序线程会被阻塞,直到内核完成该请求。IO多路复用模型允许应用程序监视多个IO句柄,并在一个线程中处理多个IO事件。
2024-02-20 18:03:25
492
原创 JAVA的几个垃圾回收器及对应的算法和算法的底层逻辑
基于色的标记-整理算法是一种垃圾回收算法,它使用颜色来标记对象,并通过整理内存空间来回收空闲空间。基于区域的垃圾回收算法是一种垃圾回收算法,它将堆划分为多个区域,并对每个区域进行单独的垃圾回收。并行标记-清除算法是一种垃圾回收算法,它通过并行标记和清除对象来回收内存空间。并行复制算法是一种垃圾回收算法,它通过并行复制对象来回收内存空间。串行复制算法是一种垃圾回收算法,它通过复制对象来回收内存空间。标记-清除算法和标记-整理算法可以结合使用,以提高垃圾回收的效率。
2024-02-20 13:58:31
1060
原创 Go可以限制运行时操作系统线程的数量吗?常见的goroutine操作函数有哪些?
Go 语言提供了丰富的 goroutine 操作函数,可以满足各种并发编程需求。
2024-02-20 10:17:38
488
原创 go语言为什么有协程泄露(Goroutine Leak)
Go 语言中协程泄露 (Goroutine Leak) 指的是协程 (Goroutine) 数量不断增加,最终导致程序崩溃或系统资源耗尽的情况。Go 语言使用垃圾回收 (GC) 机制自动管理内存,但 GC 无法回收泄露的协程。Go 语言中协程泄露是一个常见问题,了解其原因和危害,并采取措施避免,可以提高程序的稳定性和性能。一些第三方库可能存在协程泄露问题,例如使用。
2024-02-20 10:13:51
373
原创 go语言无缓冲的 channel 和有缓冲的 channel 的区别
无缓冲 channel 和有缓冲 channel 是 Go 语言中两种重要的 channel 类型。它们各有优缺点,应该根据实际需求选择合适的 channel 类型。Go 语言中的 channel 是用于 goroutine 之间通信的并发原语。channel 可以是无缓冲的,也可以是有缓冲的。
2024-02-20 10:11:38
884
原创 go语言slice是怎么扩容的?
Go 语言的切片扩容机制是在需要时自动进行的,它可以保证切片能够容纳足够多的元素。在 Go 1.8 之后,切片的扩容机制进行了改进,扩容策略更加平滑,可以减少内存碎片。
2024-02-20 10:09:47
939
原创 go语言里非接口的任意类型 T() 都能够调用 *T 的方法吗?反过来呢?
在 Go 语言中,非接口的任意类型 T() 都。非接口类型的任意类型 T() 都不能直接调用。在这个示例中,我们定义了一个类型。直接调用 *T 的方法,反过来。
2024-02-19 22:03:50
300
原创 go语言里函数返回局部变量的指针是否安全
在 Go 语言中,函数返回局部变量的指针通常是安全的。但是,在某些情况下,这可能会导致程序出现错误或崩溃。为了避免问题,请尽量避免在函数中返回局部变量的指针。如果必须返回局部变量的指针,请确保局部变量是分配在堆上的。在 Go 语言中,函数返回局部变量的指针通常是安全的。但是,在某些情况下,这可能会导致程序出现错误或崩溃。返回时,它将被销毁。是分配在栈上的,因此当函数。分配在堆上,因此即使函数。分配在堆上,因此即使函数。的值,程序可能会崩溃。在这个示例中,我们使用。在这个示例中,我们使用。
2024-02-19 22:02:21
488
原创 go语言里的2 个 nil 可能不相等吗
这是因为 Go 语言中的 nil 不仅代表零值,还包含了类型信息。如果两个 nil 的类型不同,那么它们是不相等的。Go 语言中的两个 nil 可能不相等,具体取决于它们的类型。
2024-02-19 21:20:40
217
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人