面试
文章平均质量分 79
ayu_programer
不积硅步,无以至千里
展开
-
Leetcode-438-找到字符串中所有的字母异位词
字母异位词”,指“字母相同,但排列不同的字符串”。注意这里所说的“排列不同”,是所有字母异位词彼此之间而言的,并不是说要和目标字符串p不同。给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。定义左右指针向右移动,实现滑动窗口的作用。在指针移动的过程中,字符只会被遍历一次,时间复杂度就可以大大降低。字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100。另外,我们同样应该考虑,p中可能有重复字母。原创 2024-06-05 23:05:47 · 397 阅读 · 0 评论 -
Leetcode-76-最小覆盖子串
此外,判断当前窗口是否含有所有字母,我们除了可以判断所有字母的次数是否小于等于 0,还可以用一个计数变量 count,把 count 初始化为 t 的长度,然后每次找到一个满足条件的字母,count 就减 1,如果 count 等于了 0,就代表包含了所有字母。由于字符串中只有字母,我们其实可以不用 hashmap,可以直接用一个 int 数组,字母的 ascii 码值作为下标,保存每个字母的次数。记录此时的长度,left 向右移动,开始减少长度,每减少一次,就更新最小长度。原创 2024-05-27 23:02:57 · 126 阅读 · 0 评论 -
Leetcode-239-滑动窗口的最大值
时间复杂度: O(Nk),双重循环,外层遍历数组循环N次,内层遍历窗口循环k次,所以整体就是O(N) * O(k) = O(Nk),表现较差。时间复杂度: O(Nlog(k)),在大小为 k 的堆中插入一个元素只需要消耗 log(k) 时间,因此这样改进后,算法的时间复杂度为O(Nlog(k))。这是一个典型的滑动窗口的问题。空间复杂度: O(N),输出数组使用了 O(N−k+1) 空间,双向队列使用了O(k)。空间复杂度:O(N),输出数组用到了O(N-k+1)的空间,大顶堆用了O(k)。原创 2024-05-21 22:47:16 · 751 阅读 · 0 评论 -
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 · 1005 阅读 · 0 评论 -
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 · 403 阅读 · 0 评论 -
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 · 168 阅读 · 0 评论 -
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 · 686 阅读 · 0 评论 -
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 · 298 阅读 · 0 评论 -
Leetcode-48-旋转图像
这四个矩阵的对应关系,其实是一目了然的,我们完全可以在一次循环内,把所有元素都旋转到位。这个简单的方法已经能达到最优的时间复杂度O(N^2) ,因为既然是旋转,那么每个点都应该遍历到,N^2的复杂度不可避免。旋转图像,这个应用在图片处理的过程中,非常常见。空间复杂度:O(1) 由于我们在一次循环中的操作是“就地”完成的,并且我们只用了长度为 4 的临时列表做辅助。因为旋转的时候,是上下、左右分别对称的,所以我们遍历元素的时候,只要遍历一半行、一半列就可以了(1/4元素)。我们可以利用矩阵的特性。原创 2024-04-15 22:59:12 · 905 阅读 · 0 评论 -
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 · 528 阅读 · 0 评论 -
LeetCode-15-三数之和问题
左右指针,其实借鉴的就是分治的思想,简单来说,就是在数组头尾各放置一个指针,先让头部的指针(左指针)右移,移不动的时候,再让尾部的指针(右指针)左移:最终两个指针相遇,那么搜索就结束了。之前我们搜索数组,时间复杂度至少都为O(N^2),而如果用快排或者归并,排序的复杂度,是 O(NlogN),最多也是O(N^2)。尽管时间复杂度依然为O(n^2),但是过程中避免了复杂的数据结构,空间复杂度仅为常数级O(1),可以说,双指针法是一种很巧妙、很优雅的算法设计。比暴力法的O(n^3),显然有了很大的改善。原创 2024-04-14 22:49:54 · 469 阅读 · 0 评论 -
分布式事务详解-高频面试题
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 · 661 阅读 · 0 评论 -
Java-并发高频面试题-3
Exchanger(交换者)是一个用于线程间协作的工具类。Exchanger用于进行线程间的数据交换。它提供一个同步点,在这个同步点,两个线程可以交换彼此的数据。这两个线程通过 exchange方法交换数据,如果第一个线程先执行exchange()方法,它会一直等待第二个线程也执行exchange方法,当两个线程都到达同步点时,这两个线程就可以交换数据,将本线程生产出来的数据传递给对方。线程池: 简单理解,它就是一个管理线程的池子,那么线程池有哪些好处呢?原创 2024-02-20 08:25:25 · 888 阅读 · 1 评论 -
Hot100-hash表-字母异位词分组问题
这题的关键是找到字母异位词的共同点,即他们的字符出现个数一样多,这样一来可以把每个字符映射到具体的数组上。原创 2024-02-17 19:41:39 · 245 阅读 · 0 评论 -
Hot100-hash表-两数之和
这题相对比较简单,就是用hash表来解决,key为具体数,value为下标,通过containsKey方法来判断是否存在两数之和。原创 2024-02-17 19:33:48 · 177 阅读 · 0 评论 -
Java-并发高频面试题-2
如果要想清楚锁升级,需要先知道不同锁的状态,这个锁状态其实就是java对象头中的mark word 标记字段,而这块结构会随着锁的状态的变化而变化。如下图所示:再具体细看 Mark Word存储的是对象自身的 运行数据,如哈希码、GC分代年龄、锁状态标志、偏向时间戳(Epoch) 等信息。而从上图也可以看出因为mark word状态的不同又可以区分出无锁,偏向锁,轻量级锁,重量级锁,我们依次介绍下吧无锁:简单来说就是mark word中锁状态为01时,同时在低三位不是偏向锁的状态。原创 2024-02-05 23:30:22 · 1008 阅读 · 0 评论 -
Java-并发高频面试题
说白了就是在程序执行时,为了提升效率,编译器 和执行器在执行指令时会对指令进行重排序,但是注意不能随意重排序,不是你想怎么排序就怎么排序,它需要满足以下两个条件:在单线程环境下不能改变程序运行的结果;存在数据依赖关系的不允许重排序这两个条件其实也就是两个规则as-if-serial和 happens-before;重排序不会影响单线程环境的执行结果,但是会破坏多线程的执行语义。原创 2024-01-30 23:00:05 · 1002 阅读 · 0 评论 -
Nacos注册中心核心原理
不知你是否跟我一样,在使用Nacos时有以下几点疑问:临时实例和永久实例是什么?有什么区别?服务实例是如何注册到服务端的?服务实例和服务端之间是如何保活的?服务订阅是如何实现的?集群间数据是如何同步的?CP还是AP?Nacos的数据模型是什么样的?本文就通过探讨上述问题来探秘Nacos服务注册中心核心的底层实现原理。虽然Nacos最新版本已经到了2.x版本,但是为了照顾那些还在用1.x版本的同学,所以本文我会同时去讲1.x版本和2.x版本的实现。原创 2024-01-30 08:27:08 · 731 阅读 · 0 评论 -
面试题-海量数据去重,如何实现?
布隆过滤器是一种数据结构,用于快速检索一个元素是否可能存在于一个集合(bit 数组)中。它的基本原理是利用多个哈希函数,将一个元素映射成多个位,然后将这些位设置为 1。本质上:布隆过滤器内部包含一个bit数组和多个哈希函数,每个哈希函数都会生成一个index 索引值。它由两个部分组成:一个bit数组, 存储数据多个哈希函数, 计算key的 index 索引如下图所示 这里有三个key ==》x,y,z那么问题来了:我们如何做 exist(key)这种存在性的判定呢?原创 2024-01-24 23:26:14 · 886 阅读 · 0 评论 -
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 · 778 阅读 · 0 评论 -
JVM篇--垃圾回收器高频面试题
首先CMS垃圾收集器是一种1 老年代的垃圾收集器2 是以牺牲吞吐量为代价来获取最短回收停顿时间的垃圾回收器3 多线程并发的标记-清除算法所以在gc的时候会产生大量的内存碎片,当剩余内存不能满足程序运行要求时,系统将会出现 Concurrent Mode Failure,临时 CMS 会采用 Serial Old 回收器进行垃圾清除,此时的性能将会被降低。CMS 工作机制相比其他的垃圾收集器来说更复杂。初始标记只是标记一下 GC Roots 能直接关联的对象,速度很快,仍然需要暂停所有的工作线程。原创 2024-01-21 22:36:14 · 1435 阅读 · 0 评论 -
JVM篇--垃圾回收高频面试题
首先在java运行过程中,其实程序员并不需要去显示的调用程序来释放对象的内存,而是由虚拟机来完成的,具体来看是在jvm中有个垃圾回收线程,这个线程是个守护线程,这个线程会在虚拟机空闲或者在当前堆内存不足时,才会触发执行,扫面那些没有被任何引用的对象,并将它们添加到要回收的集合中,进行回收。回收后,已用和未用的内存都各自一边。其实jvm的垃圾回收,在我们一开始创建对象的时候,GC就会去监控这个对象的地址,大小和使用情况,而jvm在进行回收的时候主要是采用了可达性分析算法,通过这种方式确定哪些对象是"可达。原创 2024-01-18 23:21:05 · 1318 阅读 · 2 评论 -
JVM篇--Java内存区域高频面试题
以Hotspot为例,堆内存主要由GC模块进行管理和分配,可以分为新生代和老年代,而新生代又可以分为eden区,s1区和s2区,并且他们的比例默认为8:1:1, 同时新生代和老年代的占比如下图所示在使用堆内内存(on-heap memory)的时候,完全遵守JVM虚拟机的内存管理机制,采用垃圾回收器(GC)统一进行内存管理,原创 2024-01-14 22:40:08 · 1126 阅读 · 0 评论 -
MYSQL篇--锁机制高频面试题
常规回答:死锁它其实是两个或者多个事务在同一个资源上相互占用,同时并请求锁定对方的资源,从而导致恶性循环的现象程序再并发存取多个表的时候,尽量让他们以相同的顺序来访问表在同一个事务中,尽可能做到一次锁定所需要的所有资源,来避免死锁问题对于比较容易产生死锁的部分,可以尝试升级锁的颗粒度,比如使用表级锁,或者分布式事务锁,或者使用乐观锁间隙锁 是 Innodb 在 RR(可重复读) 隔离级别 下为了解决 幻读问题 时引入的锁机制。原创 2024-01-11 23:23:25 · 1471 阅读 · 0 评论 -
ElasticJob篇--高频面试题
ElasticJob是一个分布式任务调度框架,用于处理大规模任务调度。它的主要特点包括灵活性、分布式能力和扩展性。灵活性:ElasticJob支持多种任务调度策略,如简单调度、Cron表达式调度等,可以根据不同的业务需求选择合适的调度方式。支持任务错过机制(misfire),可以根据配置的策略处理错过的触发时间,保证任务的连续性和正确性。提供了丰富的作业监听器和事件机制,开发者可以通过监听器来实现自定义的业务逻辑,增加灵活性。原创 2024-01-11 17:45:41 · 1053 阅读 · 0 评论 -
MYSQL篇--事务机制高频面试题
四大特性也就是原子性,一致性,隔离性,持久性首先我们看原子性说白了就是当前事务的操作要么同时成功,要么同时失败,而原子性其实是由undo log日志来保证的(这里简单介绍下undo log,undo log他其实是一种用于撤销回退的日志,也就是说在事务没提交之前 mysql会先记录更新前的数据到undo log日志文件中,当事务回滚时,可以用undo log来进行数据回滚,其实说白了undolog就是用执行的反向sql语句来进行回滚)接着看隔离性。原创 2024-01-10 23:34:36 · 1066 阅读 · 0 评论 -
面试题:为什么解决发送消息零丢失方案,一定要使用RocketMQ事务消息?
这种情况存在情况是 比如刚执行完成了订单本地事务了,还没等到你发送消息到MQ,结果你的订单系统突然崩溃了,这就导致你的订单状态可能已经修改为了“已完成”,但是消息却没发送到MQ去!o如果你要是已经完成了订单数据库更新、Redis缓存更新、ES数据更新了,结果没法送MQ呢订单系统崩溃了虽然订单数据库的操作会回滚,依然有问题,假设用户支付成功了,然后支付系统回调通知你的订单系统说,有一笔订单已经支付成功了,这个时候你的订单系统卡在多次重试MQ。事务机制复杂度提高,会导致整体性能比较差,吞吐量比较低。原创 2023-05-17 08:04:21 · 415 阅读 · 0 评论 -
RocketMQ常见面试题
01.为什么要用RocketMq?总得来说,RocketMq具有以下几个优势:吞吐量高:单机吞吐量可达十万级可用性高:分布式架构消息可靠性高:经过参数优化配置,消息可以做到0丢失功能支持完善:MQ功能较为完善,还是分布式的,扩展性好支持10亿级别的消息堆积:不会因为堆积导致性能下降源码是java:方便我们查看源码了解它的每个环节的实现逻辑,并针对不同的业务场景进行扩展可靠性高:天生为金融互联网领域而生,对于要求很高的场景,尤其是电商里面的订单扣款,以及业务削峰,在大量交易涌入时,后端可能无法原创 2021-07-21 23:25:41 · 12004 阅读 · 2 评论 -
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 · 1295 阅读 · 0 评论 -
MYSQL篇--sql优化高频面试题
其实对于性能比较低的sql语句定位,最重要的也是最有效的方法其实还是看sql的执行计划,而对于mysql来说 它其实也是提供了explain这样的命令可以便于查询sql的执行计划,并且通过执行计划 我们能够看到sql的执行情况,包括是否使用索引,使用了什么样的索引,以及使用索引的一些相关信息对于执行计划来说 它里面有几个非常关键的字段,比如说有,这个字段就表示是否用了索引,如果没用索引,key字段就为null;原创 2024-01-07 22:26:52 · 2404 阅读 · 0 评论 -
后端大厂面试-15道题
innodb 中页的默认大小是 16KB,如果不存储数据,那么 就会存储更多的键值,相应的树的阶数(节点的子节点树)就会更大,树就会 更矮更胖,如此一来我们查找数据进行磁盘的 IO 次数有会再次减少,数据查询 的效率也会更快.例如,常见的HTTP服务器(如Apache和Nginx)通常监听默认的HTTP端口80或HTTPS端口443,不同进程监听不同的端口。不同的路径可以映射到不同的进程或应用程序。例如,一个服务器可以将/app1的请求路由到一个进程,将/app2的请求路由到另一个进程,以此类推。原创 2023-09-25 14:37:31 · 455 阅读 · 0 评论 -
后端大厂面试-16道面试题
JDK1.8 中,由于多线程对HashMap进行put操作,调用了HashMap#putVal(),具体原因:假设两个线程A、B都在进行put操作,并且hash函数计算出的插入下标是相同的,当线程A执行完第六行代码后由于时间片耗尽导致被挂起,而线程B得到时间片后在该下标处插入了元素,完成了正常的插入,然后线程A获得时间片,由于之前已经进行了hash碰撞的判断,所有此时不会再进行判断,而是直接进行插入,这就导致了线程B插入的数据被线程A覆盖了,从而线程不安全。使用Key保证元素唯一性,但不保证有序性。原创 2023-09-22 13:51:38 · 2427 阅读 · 0 评论