Java Developer
用途
在以下场景使用本技能:为 LeetCode 题目编写新的 Java 解法;在 Java 中实现数据结构或算法;将其他语言的解法转换为 Java;使用 JUnit 搭建 Java 测试用例。
代码结构
遵循项目的 Java 约定:包结构为 AlgorithmJava、DataStructure、LeetCodeJava;使用 Java 8 兼容特性;包含正确的 import 和类声明;遵循 camelCase 命名约定。
针对 LeetCode 题目,采用如下结构:
package LeetCodeJava;
/**
- Problem {number}: {title}
- Difficulty: {Easy/Medium/Hard}
- {Brief problem description}
- Time Complexity: O(?)
- Space Complexity: O(?) */ public class Problem{Number}{Title} { public ReturnType methodName(InputType param) { // Implementation } }
最佳实践
面向面试优化:先写出清晰、可读的代码;只为复杂逻辑添加注释;使用有意义的变量名;显式处理边界情况。
常见模式:双指针使用 left、right 或 i、j;滑动窗口使用 start、end;二分查找使用 lo、hi、mid;DFS/BFS 使用带显式类型的 Stack/Queue。
优先使用的数据结构:当大小变化时用 List<> 代替数组;用 HashMap<> 实现 O(1) 查找;用 HashSet<> 做唯一性检查;用 PriorityQueue<> 进行堆操作;用 Deque<> 获得栈/队列的灵活性。
性能准则
时间复杂度目标:数组问题争取 O(n) 或 O(n log n);字符串问题争取用 HashMap/数组计数达到 O(n);树问题通常 O(n) 遍历即为最优;图问题 BFS/DFS 为 O(V + E)。
空间优化:尽可能原地修改输入;用位运算处理布尔数组;考虑用迭代代替递归以获得 O(1) 空间。
测试方法
包含测试用例:
// In test class @Test public void testBasicCase() { Problem{Number}{Title} solution = new Problem{Number}{Title}(); assertEquals(expected, solution.methodName(input)); }
@Test public void testEdgeCase() { // Test empty input, null, single element, etc. }
需要避免的常见错误
整数溢出:大求和时使用 long;数组越界:检查 i < arr.length;空指针:校验输入;差一错误:仔细检查循环边界;可变与不可变:注意引用。
Java 专属技巧
常用方法:
// String s.charAt(i), s.substring(i, j), s.toCharArray()
// Collections Collections.sort(list), Collections.reverse(list) Arrays.sort(arr), Arrays.fill(arr, val)
// Math Math.max(a, b), Math.min(a, b), Math.abs(x)
// Queue/Stack queue.offer(), queue.poll(), queue.peek() stack.push(), stack.pop(), stack.peek()
用于排序的 Lambda 表达式:
Arrays.sort(intervals, (a, b) -> a[0] - b[0]); PriorityQueue<int[]> pq = new PriorityQueue<>((a, b) -> a[0] - b[0]);
示例工作流
从 leetcode_java/ 读取题目或创建新文件;识别模式(双指针、滑动窗口、DP 等);用清晰的变量名编写解法;在注释中添加复杂度分析;用包含边界情况的示例进行测试;在正确解法可用后按需优化。
项目特定说明
Maven 项目:用 mvn compile 构建,用 mvn test 测试;已配置 JUnit 5 用于测试;题目按算法类型组织;遵循包内现有代码风格。