hot100【acm版】【2026.7.11/12打卡-java版本】
11.盛最多水的容器package hot100; public class lc11 { /* 盛最多水的容器 给定一个长度为 n 的整数数组 height 。 有 n 条垂线第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明你不能倾斜容器。 输入[1,8,6,2,5,4,8,3,7] 输出49 解释图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下容器能够容纳水表示为蓝色部分的最大值为 49。 */ public int maxArea(int[] nums){ int max 0; int left 0; int right nums.length-1; while(left right){ int chang right - left; int kuang Math.min(nums[left], nums[right]); int area chang*kuang; max Math.max(max,area); if(nums[left] nums[right]){ left; }else{ right--; } } return max; } public static void main(String[] args){ int[] nums new int[]{1,8,6,2,5,4,8,3,7}; lc11 solution new lc11(); System.out.println(答案 solution.maxArea(nums)); } }49. 字母异位词分组package hot100; import java.util.*; public class lc49 { /* 49. 字母异位词分组 给你一个字符串数组请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 示例 1: 输入: strs [eat, tea, tan, ate, nat, bat] 输出: [[bat],[nat,tan],[ate,eat,tea]] 解释 在 strs 中没有字符串可以通过重新排列来形成 bat。 字符串 nat 和 tan 是字母异位词因为它们可以重新排列以形成彼此。 字符串 ate eat 和 tea 是字母异位词因为它们可以重新排列以形成彼此。*/ /* char[] c str.toCharArray(); Arrays.sort(c); */ public ListListString groupAnagrams(String[] strs){ //hashmapsort MapString, ListString hashmap new HashMap(); for(String str : strs){ //stirng -- char[]sort ---string char[] temp str.toCharArray(); Arrays.sort(temp); String temps new String(temp); if(hashmap.containsKey(temps)){ ListString tmeplist hashmap.get(temps); tmeplist.add(str); hashmap.put(temps,tmeplist); }else{ ListString templist new ArrayList(); templist.add(str); hashmap.put(temps,templist); } } return new ArrayListListString(hashmap.values()); } public static void main(String[] args){ lc49 solution new lc49(); String[] test1 {eat, tea, tan, ate, nat, bat}; System.out.println(test: solution.groupAnagrams(test1)); } }128.最长连续序列package hot100; import java.util.*; public class lc128 { /*最长连续序列 给定一个未排序的整数数组 nums 找出数字连续的最长序列不要求序列元素在原数组中连续的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1 输入nums [100,4,200,1,3,2] 输出4 解释最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。 * */ //注意要点1.用set 2.在set里面遍历 public int longestConsecutive(int[] nums){ //o(n)不能排序hash //这个会超时 //MapInteger,Integer hashmap new HashMap(); //用set SetInteger hashset new HashSet(); for(int num : nums){ hashset.add(num); } //存在这个的n-1吗》找到第一个数然后有继续更新 max int max 0; //要在set里面遍历 for(int num : hashset){ if(!hashset.contains(num-1)){ int length 1; int tempnum num; while ((hashset.contains(tempnum1))){ length; tempnum; } max Math.max(max, length); } } return max; } public static void main(String[] args){ lc128 solution new lc128(); int[] nums new int[]{100,4,200,1,3,2}; System.out.println(答案 solution.longestConsecutive(nums)); } }283.移动零package hot100; import java.util.Arrays; public class lc283 { /* 移动零 给定一个数组 nums编写一个函数将所有 0 移动到数组的末尾同时保持非零元素的相对顺序。 请注意 必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] */ //模拟栈的写法 public void moveZeroes(int[] nums){ //模拟栈的写法 int stackSize 0; for(int num : nums){ if(num ! 0){ nums[stackSize] num; stackSize; } } Arrays.fill(nums, stackSize, nums.length,0); } //左右指针的写法 public void moveZeroes2(int[] nums){ } public static void main(String[] args) { lc283 solution new lc283(); int[] nums new int[]{0,1,0,3,12}; solution.moveZeroes(nums); for(int num : nums){ System.out.print(num ); } } }随机知识题目 1在 Java 生态中你会如何设计 Agent 的“工具调用”Function Calling层以支撑高并发场景考察点Java 异步编程、JSON Schema 生成、超时隔离。参考答案在大厂高并发场景下工具调用不能是简单的同步 HTTP 请求。我的设计会分三层Schema 注册与生成层利用 Java 注解如Tool和反射在启动时生成标准的 JSON Schema。为了性能我会使用GraalVM Native Image提前编译这部分或使用Jackson配合缓存避免每次调用都重新解析类结构。异步非阻塞执行层Agent 一次请求可能并行调用 5-8 个工具如同时读多个文件。我会利用Spring WebFlux或Java 21 虚拟线程Virtual Threads包装工具逻辑。对于外部 I/O 工具必须设置严格的超时阈值Timeout和熔断器Resilience4j防止单个工具卡死导致整个 Agent 循环超时Gateway Timeout。结果流式回传工具执行结果不等待全部完成再返回而是通过SSEServer-Sent Events流式推送给前端提升用户体验。题目 2Agent 的“记忆”Memory在分布式微服务架构中如何设计请给出 Java 实现方案。考察点分布式缓存、序列化、向量检索。参考答案Agent 的记忆分为短期会话上下文和长期向量库。在大厂服务是无状态的因此记忆必须外置短期记忆Short-term使用Redis 滑动窗口存储。Key 为session_idValue 为压缩后的对话列表。由于 LLM Token 有限我会在 Java 服务中启动一个后台线程利用tiktoken-java库实时计算 Token 数当超过阈值如 Context Window 的 70%时触发Summarizer调用小模型进行历史摘要压缩并用Lua 脚本保证原子性更新。长期记忆Long-term / RAG使用RedisSearch或Elasticsearch向量索引。Java 服务通过Spring AI的VectorStore接口接入。关键优化点是内存对齐将高频访问的文档片段使用Caffeine本地缓存预热减少网络 I/O。题目 3Agent 容易产生“幻觉”并执行危险的 Shell 命令或删除文件。在 Java 后端你如何构建“护栏”Guardrails来兜底考察点安全防护、路径穿越防御、正则/语义拦截。参考答案这是决定 Agent 能否上生产的核心。我有三层护栏策略路径沙箱Path SandboxJava 后端维护一个WorkspaceContext所有文件读写必须基于根目录。我会重写 Java 的FileAPI在工具层前置一个PathValidator利用java.nio.file.Path.normalize()检查路径是否包含..强行拦截跳出工作区的操作。危险命令语义拦截对于run_shell工具不直接交给 Bash 执行。我会先用Antlr4或正则表达式解析命令 AST匹配高危指令rm -rf、chmod 777、:(){ :|: };:等。匹配到危险指令时不报错而是强制转为AskUser模式通过 WebSocket 推送给前端等人工审批通过后才放行。循环熔断维护一个ConcurrentHashMap记录工具调用指纹如果同一工具连续失败或返回相同结果超过 3 次直接抛出AgentStuckException终止循环。题目 4在大厂一个 Agent 任务可能需要运行几分钟。当 Java 服务发布重启时如何实现 Agent 的无损恢复断点续传考察点状态机设计、Checkpoint 机制、序列化。参考答案我们不可能让用户因为重启重跑必须引入Checkpoint检查点。状态快照设计在 Java 中定义一个AgentState对象包含current_step_index、pending_tool_calls、compressed_memory。利用Protobuf进行序列化比 JSON 更小更快。持久化策略每次 Agent 调用关键工具前都会将AgentState异步写入RocksDB本地盘或S3。写入使用Double Buffer技术确保写操作不阻塞主循环。恢复流程服务启动时拦截用户请求检查是否存在run_id对应的 Checkpoint。如果存在使用 JavaKryo反序列化还原对象跳过已完成的步骤。关键在于幂等性设计需要将每个工具执行的结果存入状态中恢复时重放日志确保 Shell 命令不会因为重启被执行两次。题目 5在多 Agent 协作Multi-Agent系统中Java 如何解决子 Agent 上下文污染和死锁问题考察点线程模型、Actor 模式、上下文隔离。参考答案顶级大厂复杂的任务往往需要主 Agent 派发子 Agent如代码审查员、测试员。我会基于AkkaActor 模型或Spring 的 Async隔离的 ClassLoader构建。上下文污染Context Pollution每个子 Agent 拥有独立的ContextManager实例。主 Agent 给子 Agent 下任务时传递的是只读的上下文指针子 Agent 产生的工具调用结果写入自己的私有上下文。任务完成后只将最终结论Summary回调给主 Agent绝不允许子 Agent 修改主 Agent 的完整历史记录。死锁/循环依赖Deadlock设置TTL任务存活时间。同时在 Java 层维护一个有向无环图DAG依赖表。如果检测到子 Agent A 要调用子 Agent B且 B 正在等待 A 的结果立即中断并回滚。使用CompletableFuture.orTimeout()强制超时释放线程资源。碎碎念后续会更新每天学习的八股和算法 题开始准备秋招的第62/63天。努力连续更新100天以后每天就按秋招项目【java agent】科研必做项目算法八股锻炼身体来总结。总结比起之前放假完全不学习这周还是进步一点点1.hot100 【acm】 5/100 确实自己在idea里面只看题目写和测试还是有点不太一样的2.秋招项目【java 项目】【agent 项目 】2h3.科研。确定方向就搞就可以了4.实习6.背八股7.锻炼身体冲冲冲遇到困难动脑子你的价值就是解决问题的能力