自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 存取款系统接口设计

设计一个存取款接口,入参是账户数组balances 与存取款请求体数组requests。之前的取款时间在24之前的,在24小时之后返回上次取款额度的百分之2并向下取整。当前余额不足,返回余额不足帐号。返回: {900, 295}注明:1号账户余额不足。

2024-07-11 18:14:41 289

原创 交易系统接口设计

Type type;类型:余额,应收款项,应付款项。包含金额,币种,精度。request与response与上述类似。SubBalance结构: {

2024-07-09 09:56:42 249

原创 Java信号量semaphore的原理与使用方法

如果没有可用的许可,线程就会被阻塞,直到有其他线程释放一个许可。相反,release()方法会增加许可的数量,并有可能唤醒等待的线程。通过限制可用的连接数量,Semaphore确保了不会有太多的线程同时访问数据库。线程可以通过acquire()方法来获取许可,如果没有可用的许可,该线程就会阻塞,直到有许可可用。理解了Semaphore的基础和原理后,咱们现在可以探索它在实际场景中的具体使用。它的核心就是维护了一个许可集。简单来说,就是有一定数量的许可,线程需要先获取到许可,才能执行,执行完毕后再释放许可。

2024-07-07 11:21:52 390 1

原创 最小栈问题

思路是可以借助一个辅助栈,辅助栈与原始栈存储相同多的元素,对应位置是从栈底到当前栈顶这个区间的最小值,即当前栈的最小元素。设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。--> 返回 -3.minStack.getMin();--> 返回 -2.void push(int val) 将元素val推入堆栈。int getMin() 获取堆栈中的最小元素。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶部的元素。

2024-07-07 07:00:00 330

原创 1116. 打印零与奇偶数

解释:三条线程异步执行,其中一个调用 zero(),另一个线程调用 even(),最后一个线程调用odd()。此题与1115很像,都是线程的交替执行问题,不同的是有三个线程,可以用同步信号量来实现交替打印。void zero(printNumber) 调用 printNumber 以输出一个 0。” ,其中序列的长度必须为 2n。void odd(printNumber) 调用 printNumber 以输出奇数。线程 A:调用 zero() ,只输出 0。线程 C:调用 odd() ,只输出奇数。

2024-07-06 16:51:15 323

原创 Leetcode 59. 螺旋打印矩阵

给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix。更简单,因为边界更可控,是正方形,可以从外圈向中央逼近,重点是边界的处理,避免重复。输出:[[1,2,3],[8,9,4],[7,6,5]]

2024-07-06 11:30:51 415

原创 Leetcode 54. 螺旋打印矩阵

此题的关键是正确变换方向,变换方向的时机是走到了数组边界,或者是走到了已遍历的位置,所以需要记录已遍历的位置;由于变换方向的过程是循环的,周期是4,所以可以用一个自增数字对4的余数表示方向。输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,4,8,12,11,10,9,5,6,7]输出:[1,2,3,6,9,8,7,4,5]

2024-07-06 11:21:51 689

原创 简易银行交易系统

交易有效时,我们将账号 account1 的余额减少 money,账号 account2 的余额增加 money。boolean transfer(int account1, int account2, long money) 从编号为 account1 的账户向编号为 account2 的账户转帐 money 美元。如果要进行操作的帐号不在已有的帐号中,即 account>n,那么交易无效。// 账户 5 的余额为 $30 - $20 = $10 ,账户 1 的余额为 $10 + $20 = $30。

2024-07-04 11:18:33 1016

原创 Leetcode1115 交替打印 FooBar及其测试

解释:这里有两个线程被异步启动。其中一个调用 foo() 方法, 另一个调用 bar() 方法,“foobar” 将被输出一次。请设计修改程序,以确保 “foobar” 被输出 n 次。线程 A 将会调用 foo() 方法,而。可以使用同步信号量的奇偶来来实现交替打印。解释:“foobar” 将被输出两次。线程 B 将会调用 bar() 方法。输出:“foobarfoobar”输出:“foobar”

2024-07-02 21:41:26 252

原创 Leetcode1114 按序打印及其测试

输入 [1,2,3] 表示线程 A 将会调用 first() 方法,线程 B 将会调用 second() 方法,线程 C 将会调用 third() 方法。输入 [1,3,2] 表示线程 A 将会调用 first() 方法,线程 B 将会调用 third() 方法,线程 C 将会调用 second() 方法。第二种是通过锁实现,前一个线释放的锁是后一个线程的执行条件。请设计修改程序,以确保 second() 方法在 first() 方法之后被执行,third() 方法在 second() 方法之后被执行。

2024-07-02 21:29:03 392

原创 Leetcode 131 分割回文串

字符串的分割方案F(s)是一个可以拆分为子问题的问题,我们设原字符串的长度为n, 考查以当前位置i为起始点的字符串s[i][n], 对应的分割方案结果集为F(s[i][n]),若子字符串s[i][j]是回文串,那么原问题的一个子集可以表示为 {s[i][j] , s[j][n] }.所以求字符串 s的所有子字符串,这个过程也是一个动态规划,求解 f[i][j] 的时候,为了利用上前置已求得的答案,注意i是递减的, j是递增的。输出:[[“a”,“a”,“b”],[“aa”,“b”]]输出:[[“a”]]

2024-07-01 19:02:42 279

原创 Leetcode 90. 子集 II

给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集。解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。

2024-07-01 11:28:41 351

原创 Leetcode 78 数组子集

给你一个整数数组 nums ,数组中的元素 互不相同。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。示例 1:输入:nums = [1,2,3]输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]示例 2:输入:nums = [0]输出:[[],[0]]提示:nums 中的所有元素 互不相同。

2024-06-30 15:55:15 330

原创 leetcode 2741 特别的排列

其中 state 是状态压缩后的集合,其二进制表示中第 k 位为 1 则表示包含整数 nums[k]。求解时:其中j∈state。

2024-06-28 21:57:01 418

原创 二维平面无中心点的聚类算法

二维平面上有许多点p(x , y),按照彼此之间的欧式距离进行分为若干个集合。若点p1(x1, y1)与点p(x2, y2)之间距离小于d,则任务二者是邻居。给数据集的点进行编号,顺序遍历这些点,找出当前点的邻居,记住已经遍历过的点,直到遍历完数据集。

2024-06-28 14:32:10 271

原创 kafka的工作原理与常见问题

kafka是一个分布式的基于发布/订阅模式的消息队列(message queue),主要应用于大数据的实时处理领域。

2024-06-27 19:06:55 458

原创 Leetcode40 无重复组合之和

给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。若不考虑重复,一个简单的思路是递归+回溯,要考虑去重, 一种有效做法是先排序,相同元素在同一条递归路径下只被选取一次,这样可以实现有效剪枝。candidates 中的每个数字在每个组合中只能使用 一次。这个题是leetcode39的延续。注意:解集不能包含重复的组合。

2024-06-25 18:34:01 567

原创 Leetcode 560 和为 K 的子数组

给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数。子数组是数组中元素的连续非空序列。本题是找出所有中和为 k 的子数组的个数,子数组的和可以用前缀和来表示,因此是一个前缀和的问题。输入:nums = [1,1,1], k = 2。输入:nums = [1,2,3], k = 3。

2024-06-25 18:03:36 187

原创 Leetcode84 柱状图中最大的矩形

在暴力查询的基础上,研究发现,在某些情况下,可以前置信息来加速后续的查询,也就是说,可以使用动态规划来解题。使用zuo[i]数组表示从0到i,柱状图中以heights[i]为高的最大矩形宽度,从左向右遍历一次,使用you[i]数组表示从i到 len -1(终点位置),柱状图中以heights[i]为高的最大矩形宽度,再遍历一次。,第二次遍历时,也就是从i到 len -1(终点位置),向右寻找柱状图中以heights[i]为高的最大矩形时,我们更新最大面积时记得加上前一次求出的左边宽度zuo[i]数。

2024-06-23 17:57:58 639

原创 Leetcode85 01矩阵中的最大矩形

给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。动态规划的思想,记录每一个位置向上能到达的最大高度,和向左能到达的最大宽度。每走一步记录当前的最大高度并计算此时的最大面积。在一个点进行遍历时,向左走该点的最大宽度,

2024-06-22 21:00:32 286

原创 Leetcode 221. 最大正方形

在一个由 ‘0’ 和 ‘1’ 组成的二维矩阵char[][] matrix内,找到只包含 ‘1’ 的最大正方形,并返回其面积。

2024-06-22 15:59:44 304

原创 前缀树的设计

前缀树的算法实现

2024-06-21 14:53:30 355

原创 Leetcode211. 添加与搜索单词 - 数据结构设计

如果当前字符是字母,则判断当前字符对应的子结点是否存在,如果子结点存在则移动到子结点,继续搜索下一个字符,如果子结点不存在则说明单词不存在,返回 false\text{false}false;如果搜索完给定的单词的最后一个字符,则当搜索到的最后一个结点的 isEnd\textit{isEnd}isEnd 为 true\text{true}true 时,给定的单词存在。特别地,当搜索到点号时,只要存在一个非空子结点可以搜索到给定的单词,即返回 true\text{true}true。// 返回 False。

2024-06-21 11:09:05 735

原创 Leetcode236 二叉树两节点的最近公共祖先

注意此题的前置条件是一定有公共祖先,所以可以先判断当前节点是不是祖先,如果是,则继续往下找左右子树,如果左右子树中,有一边找到的公共祖先不存在,直接返回另一边子树中的查找结果,否则返回当前根节点。百度百科中最近公共祖先的定义为:对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

2024-06-17 18:40:35 394

原创 Leetcode275 H指数II

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。,可以把查找H指数的过程改成二分法,因为此题中H指数数组是已经排序好的,这样就可以实现log(N)时间复杂度。给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。基于前一题的解题思路。

2024-06-17 10:19:15 196

原创 Leetcode274. H 指数(简单易于理解)

根据维基百科上 h 指数的定义:h 代表“高引用次数” ,一名科研人员的 h 指数 是指他(她)至少发表了 h 篇论文,并且 至少 有 h 篇论文被引用次数大于等于 h。如果 h 有多种可能的值,h 指数 是其中最大的那个。根据 H指数的定义,如果当前 H指数为 h 并且在遍历过程中找到当前值 citations[i]>h,则说明我们找到了一篇被引用了至少 h+1 次的论文。计算并返回该研究者的 h 指数。首先我们可以将初始的H 指数设为 0,然后将引用次数排序,并且对排序后的数组从大到小遍历。

2024-06-16 15:19:24 185

原创 基于ChatGPT的大型语言模型试用心得

近年来,ChatGPT这样的大型语言模型,它如同一颗冉冉升起的新星,迅速在商业、教育、娱乐等多个领域照亮了创新的天空,极大地革新了我们的工作与日常生活。这个平台不仅提供了无拘无束的AI聊天功能,还整合了AI绘画、语音对话、解题等多元化功能。目前试用了字节的豆包,kimi, 还有昆仑万维的天工AI,可以帮我们定制绘画,提高英语,学习编程知识,写作,提供更精准的信息。和ai聊了下,可以讨论兴趣爱好,对房价的观点,提供情绪价值。对于不懂的代码,它还会帮我们进行解读。还可以帮助我们写一些基础代码。

2024-06-16 11:56:00 409

原创 JAVA多线程实现的三种方式

Callable接口类似于Runnable,从名字就可以看出来了,但是Runnable不会返回结果,并且无法抛出返回结果的异常,因而Callable功能更强些,被线程执行后,可以返回值,这个返回值可以被Future拿到,也就是说,Future可以拿到异步执行任务的返回值。Callable位于java.util.concurrent包下,和Runnable一样,它也是一个接口,在它里面也只声明了一个方法call(),这是一个泛型接口,call()函数返回的类型就是传递进来的V类型。

2024-06-13 18:59:08 515

原创 mysql索引失效的几种情况

mysql 索引失效的情况

2024-06-13 14:11:55 125

原创 Redis集群中使用分布式锁所遇到的问题

分布式系统在多线程开发中,经常遇到需要对资源加锁的情况,redis分布式锁是比较常见的一种解决方案。下面对Redis集群中使用分布式锁所遇到的问题给出一些解决方案。

2024-06-05 16:36:16 629

原创 LFU缓存设计

你可能会疑惑更新的时候为什么是插入到链表头,这其实是为了保证缓存在当前链表中从链表头到链表尾的插入时间是有序的,为下面的删除操作服务。那么剩下的就是删除操作了,由于我们实时维护了 minFreq,所以我们能够知道 freq_table 里目前最少使用频率的索引,同时因为我们保证了链表中从链表头到链表尾的插入时间是有序的,所以 freq_table[minFreq] 的链表中链表尾的节点即为使用频率最小且插入时间最早的节点,我们删除它同时根据情况更新 minFreq ,整个时间复杂度均为 O(1)。

2024-06-05 14:23:39 617

原创 Java 线程间信息传递方式

线程间数据传递

2024-06-04 15:38:46 244

原创 Leetcode138. 随机链表的复制

给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。构造这个链表的 深拷贝。深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点。例如,如果原链表中有 X 和 Y 两个节点,其中 X.random --> Y。

2024-06-02 17:05:23 339

原创 交易系统的设计与实现

在线交易是生活中必不可少的,交易包括支付和转账,简单理解就是个人或者商户的银行账户下资产的增减行为。在线支付一般需要借助网联进行,网联是网联清算有限公司(NetsUnion Clearing Corporation,简称NUCC)运营的第三方支付机构统一清算平台,由中国支付清算协会组织发起设立, 跨境转账一般通过NUCC进行。在线交易按类型可以大致分为:国内提取款,跨境提取款、电商平台的批次交易…

2024-04-22 17:46:15 192

原创 广告生成策略系统

在互联网大厂中,营销广告需要根据人群的特性生成对应的个性化广告,广告生成策略系统是其中必不可少的一个部分。下面以某公司的广告生成策略系统作为例子分析其架构。

2024-04-22 16:58:33 284

原创 Jvm垃圾回收器cms和g1区别

(Concurrent Mark-Sweep)垃圾回收器是Java虚拟机(JVM)综上所述,选择哪种垃圾回收器取决于应用程序的特性、性能要求以及可用硬件资源。)中的两种不同的垃圾回收策略,它们各有优缺点。G1垃圾回收器(Garbage First)和CMS。jvm垃圾回收器cms和g1区别。

2024-04-15 20:52:39 214

原创 @Transactional 详解

在接下来的整个事务中,客户代码都应该使用该connection连接数据库,执行所有数据库命令[不使用该connection连接数据库执行的数据库命令,在本事务回滚的时候得不到回滚](物理连接connection逻辑上新建一个会话session;REQUIRES_NEW,创建一个新的事务,并在其中执行当前方法,如果已经存在事务,就将其挂起,也就是说如果当前存在事务,那么将当前的事务挂起,并开启一个新事务去执行REQUIRES_NEW标志的方法。NEVER,当前方法不应该在事务中运行,如果存在事务将抛出异常。

2024-04-09 21:09:45 379

原创 rabbit mq 配置要点

所谓毒消息是指消息一直不能被消费者正常消费(可能是由于消费者失败或者消费逻辑有问题等),就会导致消息不断的重新入队,这样这些消息就成为了毒消息。Exclusivity表示独占队列,即表示队列只能由声明该队列的Connection连接来进行使用,包括队列创建、删除、收发消息等,并且独占队列会在声明该队列的Connection断开后自动删除。直接交换器(Direct Exchange): 直接交换器是最简单的交换器类型,它将消息路由到与消息中的路由键(routing key)完全匹配的队列。

2023-12-18 19:11:52 986

原创 数据库锁的设计

一般在支付、商品交易的库存变更等业务场景采用悲观锁方案;在广告、电商浏览页面、投票等场景采用乐观锁方案。

2023-12-05 17:25:30 456

原创 leetcode 241. 为运算表达式设计优先级

给你一个由数字和运算符组成的字符串 expression ,按不同优先级组合数字和运算符,计算并返回所有可能组合的结果。例:1 + 2 + 3 -> (1) + (2 + 3),1和 (2 + 3) 分别reduce到base case, 再进行两个中间的运算。expression 由数字和算符 ‘+’、‘-’ 和 ‘*’ 组成。输入:expression = “2-1-1”输出:[-34,-14,-10,-10,10]输入表达式中的所有整数值在范围 [0, 99]输入:expression = “2。

2023-09-16 20:58:43 225

空空如也

空空如也

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

TA关注的人

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