面试题目类型双指针二叉树链表滑动窗口堆&栈回溯所有回溯问题,都可以抽象成在一个“决策树”上进行深度优先搜索(DFS)的过程。这个过程包含三个关键部分:
路径(Path):已经做出的选择。在全排列问题中,就是当前已经选了哪几个数字,构成了一个不完整的排列。我们通常用一个 List 或 Stack 来记录。
选择列表(Choices):当前可以做的选择。在全排列问题中,就是那些还没有被选过的数字。
结束条件(End Condition):当“选择列表”为空,或者说“路径”的长度达到了要求(比如等于原数组长度),就意味着我们走到了决策树的叶子节点,找到了一个完整的解。此时需要把“路径”存入最终结果集。
比如说一个全排列的问题,抽象出来就是
我们需要先从选择列表中将其加入到路径之中,然后标记为已选
继续递归
下一层递归返回后,为了能去尝试其他的,就将这次的撤销,就是我们说的回溯,然后移除,标记为没有启用
面试二轮76. 最小覆盖子串(x)给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。
1234567891011121314151617181920212223242526272829303132333435363738class Solution{ public String minWindow(String S, String t) { int[] cnt = new int[128]; int less = 0; for (char c:t.toCharArray()){ if (cnt[c]==0){ less++; } cnt[c]++; } char[] s = S.toCharArray(); int m = ...
背景前面我们谈到了Spring boot 4.0版本的升级,然后对应的Spring AI 也进行维护两个大版本,一个是1.x的版本对应Spring boot的3.x版本,一个是我们的Spring AI 2.x对应我们Springboot的4.x版本,那我们来比较下这两个版本究竟有什么的不同吧!
变化
Spring Boot 4.0 升级 - 从 3.5.8 升级到 4.0.0,这是一个主要版本升级
JDK 21.0.8+ 强制要求 - 通过 maven-enforcer-plugin 强制执行,开发环境必须升级
空值处理增强,多个核心 API 返回类型标记为
@Nullable:
ChatModel.call() 可能返回 null
ChatResponse.getResult() 可能返回 null
Message.getText() 可能返回 null
这个也是Spring boot4.x版本做出的一个新的改变
比如说我们的ChatModel 接口
call(String message) 返回类型:String → @Nullable String
call(Me ...
github
未读背景最近Spring AI 发布了2.0.0的测试版本,标志着SrpingAi社区开始维护1.x版本和2.x版本。然后发现里面最大的一个区别就是Spring boot版本的升级,由之前的3.x版本升级到了4.x版本
我们首先来看下Spring boot的版本升级,为什么会再去开一个版本分支去维护呢?
Springboot4.0Spring Boot 4.0.0 的发布,不仅仅是一个版本号的简单的递增,它标志着 Spring 生态系统正式迈入了基于 Spring Framework 7.0、Java 17/25 以及 Jakarta EE 11 的全新纪元。对于当前运行在 Spring Boot 3.5.8 的企业级应用而言,向 4.0.0 的迁移不仅是一次技术栈的升级,更是一次对底层基础设施、开发范式以及运维观测体系的全面现代化重构 。
新旧版本的对比:
核心组件
Spring Boot 3.5.8 (当前状态)
Spring Boot 4.0.0 (目标状态)
架构影响分析
Spring Framework
6.2.x
7.0.x
引入了全新的 Bean 注册机制、A ...
基础知识
对比分析系统调用与一般用户程序及库函数的区别。
系统调用 (System Call):运行在内核态,通过类似硬件中断的“陷入机制(Trap)”向操作系统内核请求服务。目的是让用户程序能安全、受控地使用硬件资源。
用户程序 (User Program):运行在用户态,执行普通指令,不能直接访问硬件。
库函数 (Library Function):是将常用功能封装好的代码集合(如 printf),在编译阶段链接到程序中。库函数内部可能会调用系统调用,也可能不调用。
简述引导程序(Bootloader)两个阶段的主要任务。
第一阶段:主要负责硬件初始化(如关闭中断、初始化CPU),设置堆栈,并将第二阶段的代码从存储介质复制到 RAM 中。
第二阶段:负责检测系统内存映像,将内核映像和根文件系统映像读入 RAM,设置内核启动参数,最后调用内核。
论述进程与程序的区别与联系。
区别:
进程是动态的,强调执行过程,是资源分配和独立运行的基本单位。
程序是静态的,是一组指令的集合,存储在磁盘上。
联系:进程是程序的执行实例,一个程序可以对应多个进程(例如打开了三个浏览器窗口) ...
github
未读智能工具选择:利用 Spring AI 的动态工具发现功能节省 34-64% 的 Token 开销背景随着 AI Agent 连接的服务越来越多——Slack、GitHub、Jira、MCP 服务器——工具库也在迅速膨胀。一个典型的多服务器配置往往包含 50 多个工具,在对话开始前就可能消耗 55,000 多个 Token。更糟糕的是,当模型面对 30 多个命名相似的工具时,工具选择的准确率会显著下降。
由 Anthropic 首创的 工具搜索工具(Tool Search Tool) 模式解决了这个问题:模型不再一次性加载所有工具定义,而是按需发现工具。最初,它只接收一个搜索工具,在需要时查询相关能力,然后将相关的工具定义扩展到上下文中。这种方法在保持对数百个工具访问能力的同时,实现了 显著的 Token 节省。
关键洞察: 虽然 Anthropic 是为 Claude 引入了这种模式,但我们可以利用 Spring AI 的 递归增强器(Recursive Advisors) 为 任何 LLM 实现相同的方法。Spring AI 提供了一个可移植的抽象层,使得动态工具发现功能可以在 O ...
github
未读当 JSON 字符串中包含无引号的数字 key 时,fastjson2 的反序列化行为不一致BUG描述&&原因当 JSON 字符串中包含无引号的数字 key 时,fastjson2 的反序列化行为不一致字段存在的时候可以正确处理无引号数字 key 的逻辑字段不存在的时候无法处理
具体改动在 skipObject 方法中添加对无引号数字 key 的处理逻辑 在utf16/utf-8中
新增了一个重载方法 skipNumber(..., boolean allowColon),允许在跳过数字后紧跟着冒号(:),这在处理未加引号的数字作为键的 JSON 结构时是必需的。
在判断数字结束字符时,新增了 !(allowColon && ch == ':') 条件,即如果允许冒号且当前字符是冒号,则不抛出错误。
在解析对象键值对时,增加了对未加引号的数字作为键的处理逻辑。
如果当前字符是数字或 '-' '+',则认为这是一个未加引号的数字键,调用 skipNumber(..., true) 来跳过数字,并手动跳过紧随 ...
1. 背景与痛点随着 AI Agent 接入的业务系统越来越复杂,一个 Agent 往往挂载了数十甚至上百个工具(Tools)。在传统的实现中,我们需要将所有工具的定义(Schema)一次性注入到 Prompt 上下文中。这带来了两个严重问题:
Token 消耗巨大:海量的工具描述占用了宝贵的 Context Window,增加了推理成本。
模型注意力分散:面对大量无关工具,模型容易产生幻觉或选择错误的工具。
Spring AI 社区提出了 Tool Search 模式来解决此问题。作为 Spring AI Alibaba(SAA)社区向核心标准对齐的重要一步,我们结合 SAA 自身的 Graph Agent(图计算 Agent) 架构,重新设计并实现了这一特性。与 Spring AI 原生基于 ChatClient 的实现不同,SAA 版本将逻辑封装在 Graph 节点与拦截器中,使其更适应复杂的 Agent 工作流。
2. 设计思路:Lazy Loading 与 动态注入核心思想是“按需加载”(Lazy Loading):
初始阶段:不向 LLM 暴露任何具体的业务工具,仅注 ...
基本概念1.软件生命周期由哪些阶段组成(三个时期,八个阶段)
软件生命周期通常划分为以下结构:
软件定义时期:
问题定义
可行性研究
软件开发时期: 3. 需求分析 4. 总体设计(概要设计) 5. 详细设计 6. 编码与单元测试 7. 综合测试(集成测试与确认测试)
软件维护时期: 8. 软件维护
2.软件设计过程中应该遵循的基本原理有哪些?
在设计过程中,应遵循以下核心准则:
模块化:将系统划分为功能独立的模块。
抽象:提取核心逻辑,忽略非本质细节。
逐步求精:从宏观到微观,分层分解功能。
信息隐蔽与独立性:提高模块内部的内聚性,降低模块间的耦合性。
3.大型软件系统的测试步骤是怎么样的
测试遵循“自底向上”的过程:
单元测试:针对具体模块(函数/类)进行测试。
集成测试:将模块组装,测试接口间的协同。
确认测试(系统测试):验证系统是否满足需求规格说明。
验收测试:由用户主导,确认软件是否可投入运营。
4.面向对象方法学的有点有哪些’
复用性高:通过类和继承减少重复工作。
易维护性:封装性使得局部修改不影响全局。
稳定性好:更接近人类对现实世界的认知模 ...
基础知识
HTML:超文本标记语言,用于描述网页内容(文本、图片、声音等)。
作用:负责网页的结构与内容。
说明:定义页面中有哪些元素,如标题、段落、表单、图片、链接等。
本质:网页的“骨架”。
JavaScript:脚本语言,用于实现前台数据验证(如判空)和增加网页交互性。
作用:负责网页的行为与交互逻辑。
说明:实现表单校验、事件响应、DOM 操作、异步请求(Ajax)等。
本质:网页的“动态与交互”。
CSS:层叠样式表,用于增强网页样式并实现样式与内容分离
作用:负责网页的样式与布局。
说明:控制颜色、字体、大小、位置、页面布局(如 Flex、Grid)等。
本质:网页的“外观与美化”。
常考 <form> 标记的 action(提交地址)和 method(提交方式)属性,以及 <input> 的各种类型(text, password, submit, reset 等)
request:用于封装和获取页面提交的数据信息,常用方法是 getParameter(String name)。
response:用于设置响应信息,如重定向 sendR ...
基本概念软件项目的特殊性(4点)与 软件项目管理的特殊性是什么?
软件项目的特殊性 (4点):
不可见性 (Invisibility): 软件是逻辑实体,看不见摸不着,进度难以直观衡量。
复杂性 (Complexity): 技术复杂、业务逻辑复杂,且需求多变。
一致性/顺从性 (Conformity): 软件必须适应硬件、环境和遗留系统,而不是环境适应软件。
可变性 (Changeability): 软件容易被修改,导致“需求蔓延”。
软件项目管理的特殊性:
它是智力密集型的创造性活动。
独特性强,没有完全相同的两个项目。
不确定性高,很难精准预测进度和成本。
软件项目的招标步骤通常包括哪些?
招标 (Solicitation): 甲方发布招标公告(RFP/RFQ)。
投标 (Bidding): 乙方编写标书并投递。
开标 (Opening): 公开开启标书。
评标 (Evaluation): 专家评审技术和商务部分。
决标/授标 (Awarding): 确定中标单位。
签约 (Contracting): 签署正式合同。
四大开发模型是什么?Scrum 的三大角色、四 ...
核心概念操作系统的核心职能是有效地组织和管理计算机系统中的硬件资源(如处理器、内存、硬盘、外设),并向上层应用程序或用户提供简洁的服务功能接口,屏蔽硬件管理的复杂性。内核是操作系统的核心,主要模块包括进程调度、内存管理、设备管理、文件系统和网络管理
值得注意的是,不同的操作系统采用不同的内核架构:Linux内核通常采用宏内核(Monolithic Kernel),将大部分服务集成在内核空间中以追求高性能;而 iOS 采用混合内核(Hybrid Kernel),它结合了宏内核和微内核的优点,其核心是 Mach 微内核和 BSD 系统
进程管理简单点说:
进程管理的核心任务: 决定谁来使用 CPU,以及用多久。
通俗理解:想象 CPU 是一个 大厨,而“进程”就是一道正在做的 菜(比如炒宫保鸡丁)。代码是菜谱。虽然大厨一次只能颠一个勺,但他动作极快,一会儿切这道菜的肉,一会儿翻那道菜的锅。在旁人看来,就像他在同时做四五道菜。这就是并发。
你需要学习的关键点:
进程 vs 线程: 进程是资源分配的单位
进程状态: 就绪(Ready)、运行(Running)、阻塞(Blocked)。为什么电 ...


























