- 博客(91)
- 收藏
- 关注
原创 LangGraph 核心概念
messages: Annotated[list, add] # 自动追加消息,不覆盖节点内通过writer({"status": "正在处理…"})return {"answer": "结果"}概念作用常用度StateGraph建图的核心类★★★State+ Reducer管理共享状态(含追加/覆盖规则)★★★Node(节点)执行逻辑的函数★★★Edge(边)决定下一个执行节点★★★stream()astream()流式调用(边跑边输出)★★★。
2026-06-18 18:57:22
258
原创 LangChain 高级概念
构建工作流图# 定义一个 MCP 工具description="读取文件内容",概念核心作用关键 API/组件多 Agent 协作分工RAG基于私有知识库回答结构化输出、PydanticMCP外部工具集成标准上下文优化Few-shot、摘要、动态注入生产运维监控LangSmith、traceable、指标追踪→RAG→→→MCP→。
2026-06-18 18:56:27
343
原创 BM65 最长公共子序列(二)
dp[i][j]str1 前 i 个字符和str2 前 j 个字符的最长公共子序列长度dp[3][2]str1 前 3 个字符和str2 前 2 个字符的最长公共子序列长度。
2026-06-17 20:48:00
68
原创 RabbitMQ vs Kafka 简单总结
RabbitMQ = 让某个服务去干一件事。Kafka = 把发生过的事记录下来,让很多服务都能看。
2026-06-11 16:49:13
374
原创 SpeakCoach
场景(Scene)×4interview(求职面试)、travel(出行旅游)、daily_chat(日常闲聊)、business(商务英语)。人设(Persona)×4。理论上一台部署就能组合出16 种不同人设的 AI 陪练——你既可以选"商务英语 × 雅思考官"做严肃模拟面试,也可以选"日常闲聊 × 奶奶"做零压力口语热身。人设通过字典注入到 LLM 的 system 消息头部,定义语气、词汇、句长、纠错风格,详见。
2026-06-07 17:40:30
264
原创 AI Resume Forge:基于 LangGraph 的 AI 简历优化与模拟面试平台
AI Resume Forge 不是一个简单的简历模板项目,而是一个完整的 AI 应用开发项目。它覆盖了前端编辑器、Java 业务后端、Python Agent 后端、RAG 检索、JWT 鉴权、SSE 实时交互、PDF 导出等模块。从技术深度看,这个项目比较适合作为AI 应用开发 / Java 后端 / Agent 工程师1. 业务系统设计能力2. AI Agent 工作流编排能力3. Java + Python 异构系统集成能力SSE 流式过程展示Agent Checkpoint 中断恢复。
2026-06-06 09:50:21
651
原创 LeetCode-44 回溯解法
这道题是经典的回溯题。做选择递归撤销选择swap:把一个数放到当前的位置backtrack:递归处理下一个位置再swap:恢复现场,继续尝试别的数。
2026-03-17 21:19:30
396
原创 MyBatis Mapper 接口动态代理与 Spring 注入原理
Mapper 接口本身没有实现类,Spring + MyBatis通过动态代理生成对象。代理对象负责拦截方法调用,并执行对应 SQL。注入容器的是代理对象,调用方法时会执行 SQL。内部调用不会触发事务 / 切面逻辑,外部调用代理对象方法才生效。
2026-03-08 20:05:29
250
原创 Bean的理解
的方式去完成的,这时候spring会帮我们多做一步叫做依赖注入的步骤。方法在依赖注入完成后会自动执行,即便没有实现接口也可以。这个是自己完成的bean对象的创建,但是我们通常就是通过。Bean单例是指的 类型的名称只能有一个,毕竟是map。的话就会产生代理对象, 那么我的map里面就放的是。:由 Spring 容器管理,自动注入依赖(如果有。注意这里的代理对象的构造函数没有 任何注入,创建,程序员自己管依赖和生命周期。的话,那我的map里面就放的是普通的。这个注解),容器管生命周期。
2026-03-08 18:47:28
978
原创 Day1 项目启动记录(KnowledgeDock)
目标:完成“登录 -> 拿 token -> 管理端接口鉴权放行”,并提供一个可用的前端管理端雏形。
2026-02-02 21:06:32
612
原创 Spring Bean 注入与容器管理:从“怎么交给容器”到“怎么被注入使用”的完整总结
1) 注册阶段:把 BeanDefinition 放进容器(扫描/@Bean/@MapperScan/自动配置…)2) 创建阶段:容器按需创建 Bean(实例化)3) 注入阶段:容器解析依赖并注入(byType/byName)4) 增强阶段:AOP/事务等通过后置处理器织入代理5) 生命周期阶段:初始化回调 → 使用 → 容器关闭销毁总结:Bean 能被注入的前提是:它先通过某种方式注册进容器;Spring 创建 Bean 时会根据依赖关系完成注入,并在生命周期内统一管理初始化、增强与销毁。
2026-01-29 22:04:00
946
原创 苍穹外卖(Sky Take-out)Day 1 学习总结
拦截规则:/admin/**后台所有接口默认需要 JWT 鉴权,只有登录接口不需要 token。
2026-01-29 20:27:00
744
原创 Java 常用数据结构:API + 实现类型 + 核心原理 + 例子 + 选型与性能(完整版)
目标:把“怎么用(API)”和“为什么快/慢(实现原理)”放在同一份文档里。
2026-01-28 21:05:16
1227
原创 阿里云 OSS 注册与配置(从零开通到可用 AK/SK)标准流程文档
适合生产环境:只允许访问某个 bucket 的某些动作(Put/Get/Delete 等)。RAM 控制台 → 权限管理 → 策略 → 创建策略(JSON)写入最小策略(示例见附录 A)将策略授权给该 RAM 用户。
2026-01-27 09:20:03
1521
原创 java开发的三层架构
三层架构让“接待(Controller)→ 决策(Service)→ 搬运(Mapper)”各自专注,系统更清晰、可维护、可测试。数据库搬运工与翻译官。
2026-01-24 17:50:08
514
原创 Lombok的使用
是一个 Java 编译期工具,通过注解(Annotation)在编译阶段自动生成样板代码(如toStringLombok,生成的代码在编译后与手写代码等价。
2026-01-24 11:59:03
842
原创 Java Stream 流(Stream API)详细讲解
Stream 是数据处理工具,不是容器核心思想是流水线 + 函数式编程创建 → 中间操作 → 终止操作合理使用,不要滥用并行流。
2026-01-21 21:05:38
877
原创 Java Collection 体系与使用场景整理
是Java 集合框架(Java Collections Framework, JCF)中最基础的集合接口之一一组元素(element)的抽象集合是否能存元素是否能遍历是否能删除是否包含某元素而不关心是否有顺序是否允许重复是否支持索引声明用接口,实现用具体类Collection:只表示“一堆元素”,用于抽象、解耦、通用逻辑List:当顺序和索引是业务语义的一部分Set:当唯一性是业务约束:当访问顺序受限(FIFO/LIFO)Map:当数据是“键 → 值”关系。
2026-01-19 20:33:33
1220
原创 Java 原始类型(primitive)与包装类(wrapper)详解
本文档按以下结构组织:简明对照表 → 各类型多角度说明(定义、位宽、取值范围、默认值、用途、注意事项)→ 为什么需要包装类(多角度原因)→ 装箱/拆箱的副作用与性能考虑 → 常见陷阱与示例 → 何时使用原始类型/何时使用包装类 → 参考/补充说明。
2026-01-19 20:10:50
776
原创 Java Lambda 表达式
定义:有且仅有一个抽象方法的接口。特征:通常(但不强制)类上会有注解。原理:编译器通过上下文推断,将 Lambda 表达式自动映射到那唯一的一个抽象方法上。// 是函数式接口 (只有一个抽象方法 swimming)// 不是函数式接口 (有两个抽象方法)// 唯一的抽象方法:无参数,无返回值看到方法参数是接口。检查该接口是否只有一个抽象方法。如果是,直接写() -> {}。根据参数个数和代码行数,应用省略规则。
2026-01-17 22:20:02
457
原创 LeetCode 71:简化 Unix 路径(Simplify Path)——栈 / vector
给定一个 Unix 风格的path,请将其化简为规范路径。..
2025-12-15 21:29:01
622
原创 FIR 与 IIR 数字滤波器的区别总结
yn∑k0Mbkxn−kynk0∑Mbkxn−kFIR 只有前向加权求和,没有反馈项,冲激响应在有限长度后变为 0,因此称“有限长”。维度FIRIIR冲激响应有限长无限长结构非递归(无反馈)递归(有反馈)稳定性天然稳定取决于极点位置线性相位易实现严格线性相位通常难严格线性相位阶数/运算量通常更高阶、运算大通常低阶、运算省量化敏感性低高(可能影响稳定)设计路线数字域直接设计常由模拟原型变换。
2025-12-15 21:23:12
1080
原创 二叉树的层序遍历
子节点(left/right)如果存在,则入队;,W 为二叉树的最大层宽(队列的最大长度)。作为“队列”的写法,常数更小、性能略优。都会给出完整 C++ 代码和复杂度分析。如果我们只需要“先进先出”,可以用一个。,每个节点只进队、出队各一次。,在大数据量时会略微更快一些。记录该节点的值到当前层向量;创建一行结果,预分配容量为。表示当前队首,访问完之后。继续下一轮,直到队列为空。会有一点额外的常数开销。的经典 BFS 写法;,表示当前层有多少节点;把节点值放进当前层结果;,这是这一层的节点数;
2025-12-08 14:21:33
506
原创 Leetcode-10.正则表达式匹配(暴力 或 记忆暴力)
表示:从s的第i个字符开始的后缀s[i:],是否能匹配模式串从第j个字符开始的后缀p[j:]。也就是把原来的变成了带下标版本的。
2025-12-03 18:10:11
950
原创 克隆图(LeetCode 133)——用数组做映射的 DFS 解法
val = _val;val = _val;给定原图中的一个起点node,要求返回这张图的深拷贝(完全独立的一份图)。
2025-11-30 20:12:50
502
原创 做题调试时遇到的问题,debug的断点的watch变量也会影响结果
cloneGraph代码是对的。错误结果是因为调试器监视表达式里用了mp[node],触发了的“自动插入”行为,导致函数提前。把那些监视表达式删掉就会恢复正常。
2025-11-30 20:03:13
400
原创 LeetCode--130被围绕的区域
给定一个m x n的矩阵board,元素为'X'或'O'被'X'包围的'O'区域要被翻转为'X'与边界联通的'O'被翻转要求:原地修改board。
2025-11-29 18:26:00
403
原创 LeetCode每日一练
题目描述(LeetCode 17):给定一个只包含数字2-9的字符串,每个数字可以映射到一组字母,比如手机九宫格键盘。要求返回所有可能的字母组合。数字与字母的对应关系如下:2 -> abc3 -> def4 -> ghi5 -> jkl6 -> mno7 -> pqrs8 -> tuv9 -> wxyz例如:输入"23"。
2025-11-27 20:55:30
453
原创 复习数据结构中的Graph,并实现模板
在数据结构中,是由一组顶点(Vertex)和一组边(Edge)组成的集合,用来描述“实体之间的关系”。顶点:用来表示对象,例如城市、用户、单词等。边:表示两个顶点之间的“连接关系”,可以是:A → BA — B用一个n × n的二维数组保存边的信息,表示节点i和j之间有边。优点:判断两点是否相连是O(1)缺点:空间复杂度O(n^2),对稀疏图浪费空间为每个顶点维护一条链(或 vector),保存它的所有邻居。优点:空间复杂度接近O(n + m)(m 为边数),适合稀疏图。
2025-11-27 19:41:04
1617
原创 LeetCode:串联所有单词的子串
每一轮中,左右指针都只往前走,整体是 O(n / wordLen) 步。在块序列上做“变形的滑动窗口 + 频率统计”,控制在 O(n) 范围内。如果某个单词在窗口内出现次数比 target 需要的多了,就移动。后面滑动窗口时,会用这个 map 来对比当前窗口里的单词频率。整体时间复杂度大致是 O(n),空间是 O(m) 存单词频率。里找出所有起始下标,使得从这个下标开始的子串,刚好是把。个单词,而且每个单词频率都不超过 target,,每个单词出现一次,不多不少,顺序可以任意。
2025-11-26 22:23:07
308
原创 LeetCode每日一练(3)
这题经典思路是“滑动窗口 + 记录每个字符最后出现的位置”。(适用任何字符集)(更快,但只适用于 ASCII)下面分别给出代码和说明。
2025-11-25 22:04:49
433
原创 LeetCode每日一练(209, 167)
版本,对负数也适用,如果就是这道题的话,就定义一个sum存left到right的全部和就行,大于就移动left,小的话就移动right。返回这两个数的下标(1-based),且保证恰好存在一对解。,所有右侧元素中,随着下标减小,和单调减小;这里的实现不是经典“全正数 + 滑动窗口”的版本,而是。有序数组 + 两数之和,是双指针的典型场景。:说明和偏小,需要增大和 → 左指针右移。:说明和偏大,需要减小和 → 右指针左移。,在其中找出两个数,使得它们的和等于。更好(区间更长,和更小或相等)
2025-11-24 22:06:54
386
原创 主题:std::list<Node>::iterator 和 Node* 的区别
Node*纯粹的裸指针类型,只表示“一块内存的地址”,不知道自己属于哪个容器,也不知道这块内存是不是链表节点。STL 定义的一个迭代器类类型,语法上表现得“像指向Node的指针”,但内部通常保存的是容器节点指针和一些额外信息,用来描述:“在这条上的某一个位置”和Node*本质类型不同Node*:裸指针iterator:类类型,封装了节点指针和容器语义语义不同Node*:只是某个对象的地址iterator:某个容器上的“位置”,属于某个实例使用接口不同迭代器支持 STL 算法、容器成员函数(如。
2025-11-24 21:18:13
1035
原创 Leetcode每日一练(392.125)
不需要回退、不需要动态规划,双指针是最优解。若 s 为空直接返回 true。使用 isalnum 判断字符是否合法,用 tolower 统一大小写比对。整个过程只需一次线性扫描。
2025-11-23 21:19:25
288
原创 NebulaChat:C++ 高并发聊天室服务端
基于 C++17 的高并发聊天室服务端,是一个涵盖现代 C++、Linux 网络编程、MySQL、Redis 的综合项目。
2025-11-22 21:07:33
1084
原创 LeetCode每日一练(189, 122)
可以多次买入和卖出(不能同时持有多股),求最大利润。所以直接把所有“今天比昨天贵”的差价加起来,就是最大利润。都是线性扫描数组,加一点简单的小公式(旋转用。允许多次交易,只要不同时持有多股。备份一份原数组,避免边改边读。,股票用“所有正的差价相加”)。的元素,旋转后应该到位置。二、买卖股票的最佳时机 II。,将数组中的元素向右轮转。,就把这两天的差价加进。核心:备份原数组,用。,额外一份备份数组。
2025-11-22 19:12:46
316
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅