自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 JAVA练习381- 同构字符串

方法核心思想时间复杂度空间复杂度适用场景哈希映射(双向检查)建立双向映射表,检查一一对应关系O(n)O(∣Σ∣)通用性强,逻辑清晰字符位置映射比较字符第一次出现的位置O(n)O(1)字符集有限时效率更高一一映射:同构要求字符映射是双射(一一对应),不能出现多对一或一对多的情况。顺序保持:映射必须保持字符在原字符串中的顺序。边界条件:注意空字符串、单字符字符串、以及所有字符都相同的情况。字符集:题目说明是 ASCII 字符,但实际实现时可以考虑扩展性。

2026-08-09 17:29:59 12

原创 JAVA练习380- 赎金信

ransomNote和magazine,判断ransomNote能不能由magazine里面的字符构成。如果可以,返回true;否则返回false。magazine中的每个字符只能在ransomNote中使用一次。输入:ransomNote = "a", magazine = "b"输出:false输入:ransomNote = "aa", magazine = "ab"输出:false输入:ransomNote = "aa", magazine = "aab"输出:truemagazine。

2026-08-09 17:10:45 31

原创 JAVA练习379- 生命游戏

根据,简称为,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机。给定一个包含m × n个格子的面板,每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态:1即为(live),或0即为(dead)。下一个状态是通过将上述规则同时应用于当前状态下的每个细胞所形成的,其中细胞的出生和死亡是发生的。给你m x n网格面板board的当前状态,返回下一个状态。给定当前board的状态,board到下一个状态。你不需要返回任何东西。

2026-08-09 17:04:10 11

原创 JAVA练习378- 有效的数独

请你判断一个9 x 9的数独是否有效。只需要,验证已经填入的数字是否有效即可。1-91-91-93x3'.'输入:board =输出:true输入:board =输出:false解释:除了第一行的第一个数字从 5 改为 8 以外,空格内其他数字均与 示例1 相同。但由于位于左上角的 3x3 宫内有两个 8 存在, 因此这个数独是无效的。1-9'.'

2026-08-08 16:02:18 132

原创 JAVA面试题学习21 - volatile 关键字:作用与原子性限制

特性volatile 能否保证说明可见性✅ 能保证一个线程修改后,其他线程立即看到最新值有序性✅ 能禁止指令重排序,保证操作顺序原子性❌ 不能无法保证复合操作(如 i++)的原子性关键要点volatile 解决了可见性和有序性问题volatile不能解决原子性问题对于需要原子性的操作,应使用 synchronized 或原子类正确使用 volatile 可以避免不必要的同步开销,提高程序性能。

2026-08-07 20:54:58 102

原创 JAVA面试题学习20 - HashMap 底层原理

通过 CAS + synchronized 保证同一时刻只有一个线程能修改同一个桶。利用 volatile 的内存可见性,保证读线程能看到写线程的最新修改。迭代器创建时会捕获当前数组的快照,迭代过程中不反映后续的修改,但也不会抛出 ConcurrentModificationException。扩容时采用多线程协助迁移(helpTransfer),每个线程负责迁移一部分桶,迁移完成后再允许新操作。

2026-08-07 20:49:20 100

原创 JAVA面试题学习19 - 一台服务器能连接多少个 TCP 链接

分层排查:遇到连接数瓶颈时,按“应用程序配置 → 系统参数 → 硬件资源”的顺序进行排查。监控指标:关注ss -s显示的 TCP 连接数、内存使用率、CPU 负载、网络流量等关键指标。参数调优:根据业务场景,合理调整文件描述符数量、TCP 内核参数(如)、应用程序最大连接数等。架构升级:对于百万级并发场景,考虑采用分布式架构、负载均衡、连接池等技术来分散单点压力。通过综合优化上述因素,可以显著提升服务器的连接处理能力,支撑更高的并发用户访问。

2026-08-07 17:36:21 277

原创 JAVA面试题学习18 - 前端存储安全风险与解决方案详解

安全没有银弹。选择前端存储与认证方案时,需在用户体验、开发复杂度、系统性能与安全强度之间做出权衡。对于大多数需要强安全管控的系统,Session ID 方案仍是经过时间考验的可靠选择。若追求无状态架构且可接受一定的管理复杂度,JWT + Redis 黑名单是一个不错的折中方案。务必避免将敏感信息直接存入 localStorage,并对所有用户输入进行严格的过滤与转义,从根本上杜绝 XSS 漏洞。

2026-08-07 16:47:13 242

原创 JAVA面试题学习17 - 防欺诈/风控系统设计

通过上述“规则引擎 + 实时计算 + 图谱分析”的组合,以及“同步拦截 + 异步审核”的分层决策机制,可以构建一个既高效又精准的智能风控系统。现代风控系统通常采用多层次、立体化的防御策略,结合实时计算与离线分析,以应对复杂的业务场景和攻击手段。规则拦截是风控系统的第一道防线,通过预定义的业务规则对请求进行快速判断和拦截。知识图谱用于挖掘深层次的关联关系和复杂模式,是应对高级、隐蔽攻击的关键。对于需要基于时间窗口进行统计和判断的复杂场景,需要引入实时计算框架。

2026-08-07 16:17:49 207

原创 JAVA面试题学习16 - 订单状态机

状态机模型为复杂业务逻辑提供了清晰的结构化解决方案。通过合理设计 Guard 和 Action 机制,可以有效保证业务规则的执行。结合乐观锁处理并发问题,以及完善的日志记录解决责任追溯问题,可以构建出健壮、可维护的业务系统。

2026-08-07 16:09:10 202

原创 JAVA面试题学习15 - 订单超时取消

订单超时取消的核心是将定时扫描转化为异步事件处理。MQ延时方案在可靠性、并发控制和系统解耦方面优势明显,是生产环境推荐方案。具体选型需结合团队技术栈、业务规模和运维能力综合考虑。

2026-08-07 15:39:03 193

原创 JAVA练习377- 长度最小的子数组

滑动窗口方法是本题的最优解,时间复杂度 O(n),空间复杂度 O(1)。前缀和+二分查找方法虽然时间复杂度稍高,但展示了如何将二分查找应用于子数组和问题,是理解算法多样性的好例子。

2026-08-07 10:53:51 169

原创 JAVA面试题学习14 - 多租户SaaS系统怎么设计

2026-08-06 19:25:03 81

原创 JAVA面试题学习13 - Spring Boot 启动原理

Spring Boot 的启动流程通过高度的自动化和合理的默认配置,让开发者能够快速搭建和运行生产级应用。理解这一流程有助于我们更好地进行定制化配置、问题排查和性能优化。

2026-08-06 19:11:05 61

原创 JAVA面试题学习12 - MySQL删库不释放磁盘

MySQL 执行 DELETE 后磁盘空间未立即释放,是由于 InnoDB 的“逻辑删除+空间复用”机制。这有利于提升写入性能,但会导致数据文件不收缩。若需物理回收空间,可使用或重建表。建议结合业务场景和磁盘监控,合理安排空间优化操作。

2026-08-06 17:09:43 284

原创 JAVA面试题学习11 - 冷热分离

冷热分离是一种数据库架构优化策略,其核心思想是根据数据的访问频率和重要性,将数据划分为“热数据”和“冷数据”,并将它们存储在不同性能、不同成本的存储介质或数据库中,以达到性能与成本的最佳平衡。热数据 (Hot Data):通常指最近7到30天内被频繁访问的数据。这类数据占总体数据量的比例较小(例如10%-20%),但对访问性能要求极高,需要存储在高速、高成本的存储介质(如SSD、高性能数据库主库)上。冷数据 (Cold Data):指超过30天基本无人访问的历史数据。

2026-08-06 16:55:53 143

原创 JAVA面试题学习10 - 什么时候需要重写 hashCode 和 equals 方法

A:当框架隐藏式调用(如 set / cache / orm),且需要用业务属性进行判等时。这是为了遵守 Java 中。方法时,就必须同时重写。

2026-08-06 16:24:39 151

原创 JAVA面试题学习9 - 如何统计直播间用户停留时长和 TOP 5 排行

App 端每 30 秒进行一次统计上报(用户离开页面时立即上报)→ 消息队列(MQ)异步削峰 → Redis 通过 ZADD 存储(数据量过大时可按用户 ID 进行分片)。

2026-08-06 16:07:04 236

原创 JAVA练习376- 两数之和 II - 输入有序数组

给你一个下标从开始的整数数组numbers,该数组已按,请你从数组中找出满足相加之和等于目标数target的两个数。如果设这两个数分别是和,则。以长度为 2 的整数数组的形式返回这两个整数的下标index1和index2。你可以假设每个输入,而且你重复使用相同的元素。你所设计的解决方案必须只使用常量级的额外空间。输入:numbers = [2,7,11,15], target = 9输出:[1,2]解释:2 与 7 之和等于目标数 9。因此 index1 = 1, index2 = 2。

2026-08-06 14:38:59 173

原创 JAVA练习375- 判断子序列

给定字符串和,判断是否为的子序列。字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。如果有大量输入的 S,称作 S1, S2, ... , Sk 其中 k >= 10亿,你需要依次检查它们是否为 T 的子序列。在这种情况下,你会怎样改变代码?添加此问题并且创建所有测试用例。输入:s = "abc", t = "ahbgdc"输出:true。

2026-08-06 14:29:19 159

原创 JAVA练习374- 找出字符串中第一个匹配项的下标

给你两个字符串haystack和needle,请你在haystack字符串中找出needle字符串的第一个匹配项的下标(下标从 0 开始)。如果needle不是haystack的一部分,则返回-1。输入:haystack = "sadbutsad", needle = "sad"输出:0解释:"sad" 在下标 0 和 6 处匹配。第一个匹配项的下标是 0 ,所以返回 0。输入:haystack = "leetcode", needle = "leeto"输出:-1。

2026-07-30 16:20:48 197

原创 JAVA练习373- Z 字形变换

将一个给定字符串s根据给定的行数numRows,以从上往下、从左到右进行 Z 字形排列。比如输入字符串为行数为3时,排列如下:Y I R。请你实现这个将字符串进行指定行数变换的函数:输入:s = "PAYPALISHIRING", numRows = 3输出:"PAHNAPLSIIGYIR"输入:s = "PAYPALISHIRING", numRows = 4输出:"PINALSIGYAHRPI"解释:Y A H RP I。

2026-07-30 09:33:10 180

原创 JAVA练习372- 反转字符串中的单词

给你一个字符串s,请你反转字符串中的顺序。是由非空格字符组成的字符串。s中使用至少一个空格将字符串中的分隔开。返回顺序颠倒且之间用单个空格连接的结果字符串。输入字符串s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。输入:s = "the sky is blue"输出:"blue is sky the"输入:s = " hello world "输出:"world hello"

2026-07-30 09:16:10 184

原创 JAVA练习371- 最长公共前缀

方法思路时间复杂度空间复杂度适用场景纵向遍历逐列比较字符O(m×n)O(1)最直观,代码简洁,内存占用少横向扫描依次与前缀比较并更新O(m×n)O(m)易于理解,适合字符串长度差异大的情况分治法递归分解问题O(m×n)O(m×log n)适合并行计算或作为算法练习在实际面试或编程中,纵向遍历是最常用且高效的解法,代码简洁,空间复杂度最优。输入数组为空或为null:直接返回空字符串。数组中包含空字符串:公共前缀必然为空。所有字符串完全相同:返回任意一个字符串。

2026-07-30 09:01:12 164

原创 JAVA练习370- 最后一个单词的长度

单词的长度。

2026-07-30 08:42:12 168

原创 JAVA练习369- 整数转罗马数字

罗马数字是通过添加从最高到最低的小数位值的转换而形成的。VIIVXIIXIVIXXLXCCDCMIXCMVLD给定一个整数,将其转换为罗马数字。num = 37493000 = MMM 由于 1000 (M) + 1000 (M) + 1000 (M)700 = DCC 由于 500 (D) + 100 (C) + 100 (C)40 = XL 由于 50 (L) 减 10 (X)9 = IX 由于 10 (X) 减 1 (I)注意:49 不是 50 (L) 减 1 (I) 因为转换是基于小数位。

2026-07-29 18:26:40 189

原创 JAVA练习368- 罗马数字转整数

罗马数字包含以下七种字符:IVXLCD和M。字符 数值例如, 罗马数字2写做II,即为两个并列的 1。12写做XII,即为XII。27写做XXVII, 即为XXVII。通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做IIII,而是IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4。同样地,数字 9 表示为IX。IVXXLCCDM给定一个罗马数字,将其转换成整数。输入: s = "III"输出: 3。

2026-07-29 17:54:46 151

原创 JAVA练习367- 分发糖果

n个孩子站成一排。给你一个整数数组ratings表示每个孩子的评分。1请你给每个孩子分发糖果,计算并返回需要准备的。输入:ratings = [1,0,2]输出:5解释:你可以分别给第一个、第二个、第三个孩子分发 2、1、2 颗糖果。输入:ratings = [1,2,2]输出:4解释:你可以分别给第一个、第二个、第三个孩子分发 1、2、1 颗糖果。第三个孩子只得到 1 颗糖果,这满足题面中的两个条件。

2026-07-29 17:15:54 229

原创 JAVA练习366- 加油站

在一条环路上有n个加油站,其中第i个加油站有汽油gas[i]升。你有一辆油箱容量无限的的汽车,从第i个加油站开往第i+1个加油站需要消耗汽油cost[i]升。你从其中的一个加油站出发,开始时油箱为空。给定两个整数数组gas和cost,如果你可以按顺序绕环路行驶一周,则返回出发时加油站的编号,否则返回-1。如果存在解,则它是的。输入: gas = [1,2,3,4,5], cost = [3,4,5,1,2]输出: 3解释:从 3 号加油站(索引为 3 处)出发,可获得 4 升汽油。

2026-07-29 16:13:36 171

原创 JAVA练习365- O(1) 时间插入、删除和获取随机元素

实现valtruefalsevaltruefalse你必须实现类的所有函数,并满足每个函数的时间复杂度为O(1)。// 向集合中插入 1。返回 true 表示 1 被成功地插入。// 返回 false ,表示集合中不存在 2。// 向集合中插入 2。返回 true。集合现在包含 [1,2]。// getRandom 应随机返回 1 或 2。// 从集合中移除 1 ,返回 true。集合现在包含 [2]。// 2 已在集合中,所以返回 false。

2026-07-28 15:55:38 194

原创 JAVA练习364- H 指数

给你一个整数数组citations,其中表示研究者的第i篇论文被引用的次数。计算并返回该研究者的 h。根据维基百科上h代表“高引用次数” ,一名科研人员的h是指他(她)至少发表了h篇论文,并且有h篇论文被引用次数大于等于h。如果h有多种可能的值,h是其中最大的那个。3给定数组表示研究者总共有 5 篇论文,每篇论文相应的被引用了 3, 0, 6, 1, 5次。由于研究者有 3 篇论文每篇被引用了 3次,其余两篇论文每篇被引用3次,所以她的h指数是 3。1。

2026-07-28 15:19:28 181

原创 JAVA练习363- 买卖股票的最佳时机 II

给你一个整数数组prices,其中prices[i]表示某支股票第i天的价格。在每一天,你可以决定是否购买和/或出售股票。你在任何时候只能持有股票。然而,你可以在多次买卖该股票,但要确保你持有的股票不超过一股。返回你能获得的利润。7在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4。

2026-07-27 11:14:16 208

原创 JAVA练习362- 删除有序数组中的重复项 II

给你一个有序数组nums,请你删除重复出现的元素,使得出现次数超过两次的元素,返回删除后数组的新长度。不要使用额外的数组空间,你必须在并在使用 O(1) 额外空间的条件下完成。为什么返回数值是整数,但输出的答案是数组呢?请注意,输入数组是以方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。你可以想象内部操作如下://是以“引用”方式传递的。也就是说,不对实参做任何拷贝// 在函数里修改输入数组对于调用者是可见的。// 根据你的函数返回的长度, 它会打印出数组中的所有元素。

2026-07-26 18:19:57 9

原创 JAVA面试题学习8 - Spring Boot 自动配置原理

方法,该方法会加载 Spring 容器,并解析。当 Spring Boot 启动时,会执行。是一个复合注解,它包含。

2026-07-26 17:37:11 79

原创 JAVA面试题学习7 - SpingBean循环依赖如何解决

SpingBean循环依赖如何解决。

2026-07-26 16:47:02 51

原创 JAVA面试题学习6 - 联合索引

存在联合索引 ABC,AB、BC、BAC、A or B 是否会走索引。

2026-07-26 15:54:50 63

原创 JAVA练习361- 删除有序数组中的重复项

给你一个的数组nums,请你删除重复出现的元素,使每个元素,返回删除后数组的新长度。元素的应该保持。然后返回nums中唯一元素的个数。考虑nums的唯一元素的数量为k。去重后,返回唯一元素的数量k。nums的前k个元素应包含的唯一数字。下标k - 1之后的剩余元素可以忽略。系统会用下面的代码来测试你的题解:// 输入数组// 长度正确的期望答案// 调用i < k;i++) {如果所有断言都通过,那么您的题解将被。函数应该返回新的长度2,并且原数组nums的前两个元素被修改为1。

2026-07-26 15:35:15 184

原创 JAVA练习360- 移除元素

给你一个数组nums和一个值val,你需要移除所有数值等于val的元素。元素的顺序可能发生改变。然后返回nums中与val不同的元素的数量。假设nums中不等于val的元素数量为knumsnumskvalnumsnumsk评测机将使用以下代码测试您的解决方案:// 输入数组// 要移除的值// 长度正确的预期答案。// 它以不等于 val 的值排序。// 调用你的实现// 排序 nums 的前 k 个元素i < k;i++) {如果所有的断言都通过,你的解决方案将会。

2026-07-26 15:12:05 150

原创 JAVA练习359- 合并两个有序数组

给你两个按排列的整数数组nums1和nums2,另有两个整数m和n,分别表示nums1和nums2中的元素数目。请你nums2到nums1中,使合并后的数组同样按排列。最终,合并后数组不应由函数返回,而是存储在数组nums1中。为了应对这种情况,nums1的初始长度为m + n,其中前m个元素表示应合并的元素,后n个元素为0,应忽略。nums2的长度为n。需要合并 [1,2,3] 和 [2,5,6]。合并结果是 [,2,,5,6] ,其中斜体加粗标注的为 nums1 中的元素。[1]

2026-07-26 14:39:38 153

原创 JAVA练习358- 编辑距离

给你两个单词word1和word2请返回将word1转换成word2所使用的最少操作数。3horse -> rorse (将 'h' 替换为 'r')rorse -> rose (删除 'r')rose -> ros (删除 'e')5intention -> inention (删除 't')inention -> enention (将 'i' 替换为 'e')enention -> exention (将 'n' 替换为 'x')

2026-07-26 08:46:59 219

空空如也

空空如也

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

TA关注的人

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