自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(91)
  • 资源 (2)
  • 收藏
  • 关注

原创 Leetcode-316-去除重复字母

首先,seen 中字符不重复,其大小会受字母表大小的限制,所以是O(1)。虽然看起来是双重循环,但内循环的次数受栈中剩余字符总数的限制,因为栈中的元素不重复,不会超出字母表大小,因此最终复杂度仍为 O(N)。空间复杂度:O(N),每次给字符串切片都会创建一个新的字符串(字符串不可变),切片的数量受常数限制,最终复杂度为 O(N) * C = O(N)。空间复杂度:O(N),每次给字符串切片都会创建一个新的字符串(字符串不可变),切片的数量受常数限制,最终复杂度为 O(N) * C = O(N)。

2024-05-06 22:53:40 392

原创 Leetcode-43-字符串相乘

做计算的时候,外层需要从右往左遍历num2,而对于num2的每一位,都需要和 num1的每一位计算乘积,因此计算乘积的总次数是 mn。而且,某两个数位相乘,num1[i] x num2[j] 的结果(定义为两位数,一位数的话前面补0),其第一位位于 result[i+j],第二位位于 result[i+j+1]。需要计算num1 的每一位和 num2的每一位的乘积。给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。

2024-04-28 23:09:56 379

原创 Leetcode-415-字符串相加问题

这里不允许直接将输入字符串转为整数,那自然想到应该把字符串按每个字符char一一拆开,相当于遍历整数上的每一个数位,然后通过“乘10叠加”的方式,就可以整合起来了。时间复杂度:O(max(len1,len2)),其中len1 =num1.length,len2 =num2.length。另外题目要求不能使用BigInteger的内建库,这其实就是让我们自己实现一个大整数相加的功能。给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。1.num1 和num2 的长度都小于 5100。

2024-04-28 22:53:17 146

原创 Leetcode-287-寻找重复数

空间复杂度: O(1) (or O(n)),在这里,我们对 nums 进行了排序,因此内存大小是固定的。这里,nums 中的每个数字(n+1个)都是一个物品,nums 中可以出现的每个不同的数字(n个)都是一个 “抽屉”。二分查找最多需要O(logn) 次,而每次判断count的时候需要O(n) 遍历 nums[] 数组求解小于等于 i 的数的个数,因此总时间复杂度为O(nlogn)。时间复杂度:O(n),我们只对数组做了一次遍历,在HashMap和HashSet中查找的复杂度是O(1)。

2024-04-27 23:01:02 674

原创 Leetcode-74-搜索二维矩阵

行列坐标为(row, col)的元素,展开之后索引下标为idx = row * n + col;输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,50]], target = 13。输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,50]], target = 3。编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。时间复杂度 : 由于是标准的二分查找,时间复杂度为O(log(m n))。

2024-04-27 22:39:01 284

原创 Leetcode-48-旋转图像

这四个矩阵的对应关系,其实是一目了然的,我们完全可以在一次循环内,把所有元素都旋转到位。这个简单的方法已经能达到最优的时间复杂度O(N^2) ,因为既然是旋转,那么每个点都应该遍历到,N^2的复杂度不可避免。旋转图像,这个应用在图片处理的过程中,非常常见。空间复杂度:O(1) 由于我们在一次循环中的操作是“就地”完成的,并且我们只用了长度为 4 的临时列表做辅助。因为旋转的时候,是上下、左右分别对称的,所以我们遍历元素的时候,只要遍历一半行、一半列就可以了(1/4元素)。我们可以利用矩阵的特性。

2024-04-15 22:59:12 885

原创 LeetCode-31-下一个排列问题

不过具体操作会发现,如果正序子序列后没数了,那么子序列的“下一个”一定就是整个序列的“下一个”,这样做没问题;但如果后面还有逆序排列的数,这样就不对了。比如 [1,3,8,7,6,2]最后的正序子序列是[1,3,8],但显然不能直接换成[1,8,3]就完事了;而应该考虑把3换成后面比3大、但比8小的数,而且要选最小的那个(6)。接下来,还要让6之后的所有数,做一个升序排列,得到结果:[1,6,2,3,7,8]

2024-04-14 23:11:49 515

原创 LeetCode-15-三数之和问题

左右指针,其实借鉴的就是分治的思想,简单来说,就是在数组头尾各放置一个指针,先让头部的指针(左指针)右移,移不动的时候,再让尾部的指针(右指针)左移:最终两个指针相遇,那么搜索就结束了。之前我们搜索数组,时间复杂度至少都为O(N^2),而如果用快排或者归并,排序的复杂度,是 O(NlogN),最多也是O(N^2)。尽管时间复杂度依然为O(n^2),但是过程中避免了复杂的数据结构,空间复杂度仅为常数级O(1),可以说,双指针法是一种很巧妙、很优雅的算法设计。比暴力法的O(n^3),显然有了很大的改善。

2024-04-14 22:49:54 454

原创 分布式事务详解-高频面试题

XA协议 其实又叫 XA规范 具体来看就是 XA规范(XA Specification) 是X/OPEN 提出的分布式事务处理规范。XA则规范了TM(事务管理器)与RM(资源管理器)之间的通信接口,在TM与多个RM之间形成一个双向通信桥梁,从而在多个数据库资源下保证ACID四个特性。目前知名的数据库,如Oracle, DB2,mysql等,都是实现了XA接口的,都可以作为RM那么基于XA规范下的具体实现就是2PC和3PC。

2024-03-03 18:10:47 638

原创 Java-并发高频面试题-3

Exchanger(交换者)是一个用于线程间协作的工具类。Exchanger用于进行线程间的数据交换。它提供一个同步点,在这个同步点,两个线程可以交换彼此的数据。这两个线程通过 exchange方法交换数据,如果第一个线程先执行exchange()方法,它会一直等待第二个线程也执行exchange方法,当两个线程都到达同步点时,这两个线程就可以交换数据,将本线程生产出来的数据传递给对方。线程池: 简单理解,它就是一个管理线程的池子,那么线程池有哪些好处呢?

2024-02-20 08:25:25 859 1

原创 Hot100-hash表-字母异位词分组问题

这题的关键是找到字母异位词的共同点,即他们的字符出现个数一样多,这样一来可以把每个字符映射到具体的数组上。

2024-02-17 19:41:39 232

原创 Hot100-hash表-两数之和

这题相对比较简单,就是用hash表来解决,key为具体数,value为下标,通过containsKey方法来判断是否存在两数之和。

2024-02-17 19:33:48 163

原创 Java-并发高频面试题-2

如果要想清楚锁升级,需要先知道不同锁的状态,这个锁状态其实就是java对象头中的mark word 标记字段,而这块结构会随着锁的状态的变化而变化。如下图所示:再具体细看 Mark Word存储的是对象自身的 运行数据,如哈希码、GC分代年龄、锁状态标志、偏向时间戳(Epoch) 等信息。而从上图也可以看出因为mark word状态的不同又可以区分出无锁,偏向锁,轻量级锁,重量级锁,我们依次介绍下吧无锁:简单来说就是mark word中锁状态为01时,同时在低三位不是偏向锁的状态。

2024-02-05 23:30:22 979

原创 Java-并发高频面试题

说白了就是在程序执行时,为了提升效率,编译器 和执行器在执行指令时会对指令进行重排序,但是注意不能随意重排序,不是你想怎么排序就怎么排序,它需要满足以下两个条件:在单线程环境下不能改变程序运行的结果;存在数据依赖关系的不允许重排序这两个条件其实也就是两个规则as-if-serial和 happens-before;重排序不会影响单线程环境的执行结果,但是会破坏多线程的执行语义。

2024-01-30 23:00:05 971

原创 Nacos注册中心核心原理

不知你是否跟我一样,在使用Nacos时有以下几点疑问:临时实例和永久实例是什么?有什么区别?服务实例是如何注册到服务端的?服务实例和服务端之间是如何保活的?服务订阅是如何实现的?集群间数据是如何同步的?CP还是AP?Nacos的数据模型是什么样的?本文就通过探讨上述问题来探秘Nacos服务注册中心核心的底层实现原理。虽然Nacos最新版本已经到了2.x版本,但是为了照顾那些还在用1.x版本的同学,所以本文我会同时去讲1.x版本和2.x版本的实现。

2024-01-30 08:27:08 684

原创 面试题-海量数据去重,如何实现?

布隆过滤器是一种数据结构,用于快速检索一个元素是否可能存在于一个集合(bit 数组)中。它的基本原理是利用多个哈希函数,将一个元素映射成多个位,然后将这些位设置为 1。本质上:布隆过滤器内部包含一个bit数组和多个哈希函数,每个哈希函数都会生成一个index 索引值。它由两个部分组成:一个bit数组, 存储数据多个哈希函数, 计算key的 index 索引如下图所示 这里有三个key ==》x,y,z那么问题来了:我们如何做 exist(key)这种存在性的判定呢?

2024-01-24 23:26:14 828

原创 JVM篇--JVM调优高频面试题

1 先打印gc的情况,即通过jstat -gc PID 1000 查看 GC 次数,时间等信息,看看对象的GC 次数是否频繁,而且每次回收的内存空间是否正常,如果说每次回收的内存都很少,GC非常频繁 那么可能是因为内存泄露导致的。首先我们要知道,内存飚高如果是发生在 java 进程上,一般是因为创建了大量对象所导致,而如果持续飚高意味着垃圾回收跟不上对象创建的速度,或者内存泄露导致对象无法回收。-XX:NewRatio=4:设置年轻的和老年代的内存比例为 1:4;-Xmx2g:堆最大内存为 2g;

2024-01-24 08:57:52 715

原创 JVM篇--垃圾回收器高频面试题

首先CMS垃圾收集器是一种1 老年代的垃圾收集器2 是以牺牲吞吐量为代价来获取最短回收停顿时间的垃圾回收器3 多线程并发的标记-清除算法所以在gc的时候会产生大量的内存碎片,当剩余内存不能满足程序运行要求时,系统将会出现 Concurrent Mode Failure,临时 CMS 会采用 Serial Old 回收器进行垃圾清除,此时的性能将会被降低。CMS 工作机制相比其他的垃圾收集器来说更复杂。初始标记只是标记一下 GC Roots 能直接关联的对象,速度很快,仍然需要暂停所有的工作线程。

2024-01-21 22:36:14 1317

原创 JVM篇--垃圾回收高频面试题

首先在java运行过程中,其实程序员并不需要去显示的调用程序来释放对象的内存,而是由虚拟机来完成的,具体来看是在jvm中有个垃圾回收线程,这个线程是个守护线程,这个线程会在虚拟机空闲或者在当前堆内存不足时,才会触发执行,扫面那些没有被任何引用的对象,并将它们添加到要回收的集合中,进行回收。回收后,已用和未用的内存都各自一边。其实jvm的垃圾回收,在我们一开始创建对象的时候,GC就会去监控这个对象的地址,大小和使用情况,而jvm在进行回收的时候主要是采用了可达性分析算法,通过这种方式确定哪些对象是"可达。

2024-01-18 23:21:05 1199 2

原创 JVM篇--Java内存区域高频面试题

以Hotspot为例,堆内存主要由GC模块进行管理和分配,可以分为新生代和老年代,而新生代又可以分为eden区,s1区和s2区,并且他们的比例默认为8:1:1, 同时新生代和老年代的占比如下图所示在使用堆内内存(on-heap memory)的时候,完全遵守JVM虚拟机的内存管理机制,采用垃圾回收器(GC)统一进行内存管理,

2024-01-14 22:40:08 1056

原创 MYSQL篇--锁机制高频面试题

常规回答:死锁它其实是两个或者多个事务在同一个资源上相互占用,同时并请求锁定对方的资源,从而导致恶性循环的现象程序再并发存取多个表的时候,尽量让他们以相同的顺序来访问表在同一个事务中,尽可能做到一次锁定所需要的所有资源,来避免死锁问题对于比较容易产生死锁的部分,可以尝试升级锁的颗粒度,比如使用表级锁,或者分布式事务锁,或者使用乐观锁间隙锁 是 Innodb 在 RR(可重复读) 隔离级别 下为了解决 幻读问题 时引入的锁机制。

2024-01-11 23:23:25 1383

原创 ElasticJob篇--高频面试题

ElasticJob是一个分布式任务调度框架,用于处理大规模任务调度。它的主要特点包括灵活性、分布式能力和扩展性。灵活性:ElasticJob支持多种任务调度策略,如简单调度、Cron表达式调度等,可以根据不同的业务需求选择合适的调度方式。支持任务错过机制(misfire),可以根据配置的策略处理错过的触发时间,保证任务的连续性和正确性。提供了丰富的作业监听器和事件机制,开发者可以通过监听器来实现自定义的业务逻辑,增加灵活性。

2024-01-11 17:45:41 999

原创 MYSQL篇--事务机制高频面试题

四大特性也就是原子性,一致性,隔离性,持久性首先我们看原子性说白了就是当前事务的操作要么同时成功,要么同时失败,而原子性其实是由undo log日志来保证的(这里简单介绍下undo log,undo log他其实是一种用于撤销回退的日志,也就是说在事务没提交之前 mysql会先记录更新前的数据到undo log日志文件中,当事务回滚时,可以用undo log来进行数据回滚,其实说白了undolog就是用执行的反向sql语句来进行回滚)接着看隔离性。

2024-01-10 23:34:36 965

原创 MYSQL篇--索引高频面试题

1最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、 3 and d = 4如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整2 =和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式。

2024-01-08 23:09:15 1194

原创 MYSQL篇--sql优化高频面试题

其实对于性能比较低的sql语句定位,最重要的也是最有效的方法其实还是看sql的执行计划,而对于mysql来说 它其实也是提供了explain这样的命令可以便于查询sql的执行计划,并且通过执行计划 我们能够看到sql的执行情况,包括是否使用索引,使用了什么样的索引,以及使用索引的一些相关信息对于执行计划来说 它里面有几个非常关键的字段,比如说有,这个字段就表示是否用了索引,如果没用索引,key字段就为null;

2024-01-07 22:26:52 1848

原创 01-Redis核心数据结构与高性能原理

Redis的单线程主要是指,这也是 Redis 对外提供键值存储服务的主要流程。但 Redis 的其他功能,比如。

2023-12-06 23:00:27 203

原创 线上问题整理-ConcurrentModificationException异常

商品改价:商品改价中通过多线程批量处理经过 Lists.partition拆分的集合对象。

2023-11-27 17:39:18 176

原创 后端大厂面试-15道题

innodb 中页的默认大小是 16KB,如果不存储数据,那么 就会存储更多的键值,相应的树的阶数(节点的子节点树)就会更大,树就会 更矮更胖,如此一来我们查找数据进行磁盘的 IO 次数有会再次减少,数据查询 的效率也会更快.例如,常见的HTTP服务器(如Apache和Nginx)通常监听默认的HTTP端口80或HTTPS端口443,不同进程监听不同的端口。不同的路径可以映射到不同的进程或应用程序。例如,一个服务器可以将/app1的请求路由到一个进程,将/app2的请求路由到另一个进程,以此类推。

2023-09-25 14:37:31 438

原创 贪心算法-点灯问题

X’ 表示墙,不能放灯,点亮不点亮都可;’.’ 表示居民点,可以放灯,需要点亮。如果灯放在i位置,可以让 i-1,i 和 i+1 三个位置被点亮。(4)i 位置是 ‘.’ ,i + 1是 ‘.’,i + 2是 'X’,i 或 i + 1 位置需要放灯,(3)i 位置是 ‘.’ ,i + 1是 ‘.’,i + 2是 ‘.’,i + 1 位置需要放灯,(2)i 位置是 ‘.’ ,i + 1是 'X’,i 位置需要放灯,(1)i 位置是 'X’,不管,来到 i + 1位置。

2023-09-25 10:35:30 457

原创 Spring之依赖注入源码解析

基于Autowired的依赖注入底层原理。

2023-09-24 22:03:52 288

原创 Spring之bean的生命周期源码解析

2 实例化5 自动注入7 Aware对象9 初始化。

2023-09-23 09:19:05 126

原创 后端大厂面试-16道面试题

JDK1.8 中,由于多线程对HashMap进行put操作,调用了HashMap#putVal(),具体原因:假设两个线程A、B都在进行put操作,并且hash函数计算出的插入下标是相同的,当线程A执行完第六行代码后由于时间片耗尽导致被挂起,而线程B得到时间片后在该下标处插入了元素,完成了正常的插入,然后线程A获得时间片,由于之前已经进行了hash碰撞的判断,所有此时不会再进行判断,而是直接进行插入,这就导致了线程B插入的数据被线程A覆盖了,从而线程不安全。使用Key保证元素唯一性,但不保证有序性。

2023-09-22 13:51:38 2382

原创 贪心算法-IPO问题

然后,有两个数组,一个cost[],里面记录了每个项目需要花费的资金。一个profit数组,里面记录了每个项目完成后可以获取的利润。然后请你计算出,给你一个初始资金w,和最大项目次数k的情况下,可以获取的最大利润。那么,初始资金只能够花费来进行第一个10的项目,其他项目买不起,然后,第一个项目做完,利润是10,现在手里有20,就可以进行第二个项目了,然后再累加利润,看看能不能再解锁新项目。例如:初始资金10,k=3,cost[10,20,30,40],profit[10,20,30,40]

2023-09-21 21:01:59 270

原创 贪心算法-金条切割问题

金条要分成10,20,30。如果先把长度60的金条分成10和50,花费60;再把长度50的金条分成20和30,花费50;一共花费110铜板。一块金条切成两半,是需要花费和长度数值一样的铜板的。比如长度为20的金条,不管切成长度多大的两半,都要花费20个铜板。但是如果先把长度60的金条分成30和30,花费60;再把长度30金条分成10和20,花费30;例如,给定数组{10,20,30},代表一共三个人,整块金条长度为10+20+30=60。之后再把累加值放到小根堆里去,所有的累加和即为最小代价。

2023-09-21 20:56:57 338

原创 贪心算法-会议室问题

现在给你两个长度一样的数组,starts数组代码每个会议开始的时间,ends数组代表每个会议结束的时间。贪心算法是纯粹的积累经验类型的算法思想,贪心策略的正确性证明是非常困难的,几乎不可能证明正确性,因此,只能通过对数器进行验证。导致它前面的时间浪费了,后面的时间可能正好差一点不够一个会议,这样也很浪费,肯定不是最优解。因此,排除掉1和2,此题的最优贪心算法应该就是3。1.按照最早开始的会议排序,最早开始的优先。2.按照最短时间排序,时间最短的优先。3.按照最早结束排序,最早结束的优先。

2023-09-21 20:49:11 416

原创 贪心算法-拼接字符串使得字典顺序最小问题

给定一个由字符串组成的数组strs,必须把所有字符串拼接起来,返回所有可能的拼接结果中,字典序最小的结果。:对数组排序,排序规则是对a+b和b+a的字符串进行比较大小,返回较小的顺序放到数组中最后将数组累加即得。

2023-09-21 20:38:35 361

原创 redis事务对比Lua脚本区别是什么

Redis使用同一个Lua解释器来执行所有命令,同时,Redis保证以一种原子性的方式来执行脚本:当lua脚本在执行的时候,不会有其他脚本和命令同时执行,这种语义类似于 MULTI/EXEC。从别的客户端的视角来看,一个lua脚本要么不可见,要么已经执行完。然而这也意味着,执行一个较慢的lua脚本是不建议的,由于脚本的开销非常低,构造一个快速执行的脚本并非难事。但是你要注意到,当你正在执行一个比较慢的脚本时,所以其他的客户端都无法执行命令。

2023-08-15 11:23:46 1021

原创 面试题:为什么解决发送消息零丢失方案,一定要使用RocketMQ事务消息?

这种情况存在情况是 比如刚执行完成了订单本地事务了,还没等到你发送消息到MQ,结果你的订单系统突然崩溃了,这就导致你的订单状态可能已经修改为了“已完成”,但是消息却没发送到MQ去!o如果你要是已经完成了订单数据库更新、Redis缓存更新、ES数据更新了,结果没法送MQ呢订单系统崩溃了虽然订单数据库的操作会回滚,依然有问题,假设用户支付成功了,然后支付系统回调通知你的订单系统说,有一笔订单已经支付成功了,这个时候你的订单系统卡在多次重试MQ。事务机制复杂度提高,会导致整体性能比较差,吞吐量比较低。

2023-05-17 08:04:21 390

原创 面试题:RocketMQ事务消息机制的底层实现原理

rocketmq后台有定时任务,定时任务会去扫描RMQ_SYS_TRANS_HALF_TOPIC中的half消息,如果你超过一定时间还是half消息,他会回调业务系统的接口,让你判断这个half消息是要rollback还是commit。接着需要把放在RMQ_SYS_TRANS_HALF_TOPIC中的half消息给写入到原始Topic的ConsumeQueue里去,然后我们的红包系统可以就可以看到这条消息进行消费了。然后正常情况下然后业务系统按理说会从这个ConsumeQueue里获取到你写入的这个消息。

2023-05-15 08:18:42 335

原创 动态规划问题-求最长回文子序列长度

所以列L 是从N-3出发(N-1和N-2已经填完了);最长回文子序列是 “123c321” 或者1234321 返回长度为7。通过画图知道,每一行依赖于它下边的,左边的格子,左边下角的格子。给定一个字符串str,返回这个字符串的最长回文子序列长度。因为每一个数都依赖它左边的,下边的,左下的 并求最大值。所以 应该从下往上填,但是每一行又是从左往右填写。回文串 开始位置不算, 结束位置不算。开始位置算, 结束位置不算。开始位置不算, 结束位置算。开始位置算, 结束位置算。

2023-02-24 09:36:19 259

乐优商城项目资料包.rar

乐优商城项目资料包+sql文件

2021-02-17

大数据框架flink项目笔记

千峰教育最新的大数据框架flink项目笔记

2021-02-16

空空如也

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

TA关注的人

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