学习笔记:用 Java 刷题的心得与进步
学习方法与心得
在使用豆包 MarsCode AI 辅助 Java 刷题的过程中,我体会到了高效学习的意义。以下从学习方法、题目解析、知识总结与计划制定等方面分享我的心得。
学习方法:AI 辅助刷题
- 分阶段学习:先掌握题目所涉及的基础知识,再通过实际编程练习巩固。
- 错误驱动学习:每次解题后都会进行代码运行与调试。通过 AI 反馈明确自己的错误原因,深刻理解问题。
- 反复优化:在 AI 的引导下,尝试改进代码结构,例如减少冗余、提高可读性、优化性能。
题目解析一:村庄取暖问题
问题描述
已知一个二叉树代表村庄分布,每个节点需要暖炉覆盖。暖炉可以覆盖父节点、当前节点以及所有子节点。目标是计算需要最少暖炉数使村庄所有节点都被覆盖。
解题思路
-
构建二叉树:根据层次遍历数组生成二叉树。
-
状态设计:
0:节点未被覆盖。1:节点已被覆盖,但未安装暖炉。2:节点安装了暖炉。
-
递归处理:从叶节点往根节点逐层判断覆盖状态,结合安装暖炉的最优策略。
代码实现
import java.util.LinkedList;
import java.util.Queue;
public class Main {
static class TreeNode {
int val;
TreeNode left, right;
TreeNode(int val) {
this.val = val;
}
}
public static int solution(int[] nodes) {
TreeNode root = buildTree(nodes);
int[] result = dfs(root);
return result[0] == 0 ? result[1] + 1 : result[1];
}
private static int[] dfs(TreeNode node) {
if (node == null) {
return new int[]{1, 0};
}
int[] left = dfs(node.left);
int[] right = dfs(node.right);
if (left[0] == 0 || right[0] == 0) {
return new int[]{2, left[1] + right[1] + 1};
}
if (left[0] == 2 || right[0] == 2) {
return new int[]{1, left[1] + right[1]};
}
return new int[]{0, left[1] + right[1]};
}
private static TreeNode buildTree(int[] nodes) {
if (nodes.length == 0 || nodes[0] == 0) {
return null;
}
TreeNode root = new TreeNode(nodes[0]);
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
int i = 1;
while (i < nodes.length) {
TreeNode curr = queue.poll();
if (i < nodes.length && nodes[i] == 1) {
curr.left = new TreeNode(1);
queue.offer(curr.left);
}
i++;
if (i < nodes.length && nodes[i] == 1) {
curr.right = new TreeNode(1);
queue.offer(curr.right);
}
i++;
}
return root;
}
public static void main(String[] args) {
int[] nodes = {1, 1, 0, 1, 1};
System.out.println(solution(nodes)); // 输出 1
}
}
题目解析二:双十一优惠问题
问题描述
小F购买了若干商品,某件商品价格可以优惠为最近一件价格不高于当前商品的价格。计算小F能获得的总优惠金额。
解题思路
- 倒序遍历:利用栈存储当前商品价格,逐步寻找符合条件的最近优惠。
- 计算优惠:对于每件商品,从栈中获取满足条件的价格,累加到优惠金额中。
代码实现
import java.util.Stack;
public class Main {
public static int solution(int N, int[] p) {
Stack<Integer> stack = new Stack<>();
int result = 0;
for (int i = 0; i < N; i++) {
stack.push(p[i]);
}
while (!stack.isEmpty()) {
for (int i = N - 2; i >= 0; i--) {
if (stack.peek() >= stack.get(i)) {
result += stack.get(i);
break;
}
}
stack.pop();
N--;
}
return result;
}
public static void main(String[] args) {
int[] prices = {9, 4, 5, 2, 4};
System.out.println(solution(5, prices)); // 输出 6
}
}
题目解析三:括号字符串校验问题
问题描述
给定一个括号字符串,计算最少需要插入的括号数量以使其成为有效括号字符串。
解题思路
- 栈存储左括号:遇到右括号时尝试配对,若无可配对的左括号则需插入。
- 结果计算:遍历结束后,栈中未匹配的左括号数量加上需要插入的右括号数量即为最终结果。
代码实现
import java.util.Stack;
public class Main {
public static int solution(String s) {
Stack<Character> stack = new Stack<>();
int count = 0;
for (char c : s.toCharArray()) {
if (c == '(') {
stack.push(c);
} else if (c == ')') {
if (stack.isEmpty()) {
count++;
} else {
stack.pop();
}
}
}
return count + stack.size();
}
public static void main(String[] args) {
String s = "()))((";
System.out.println(solution(s)); // 输出 4
}
}
知识总结
通过这几道题的学习,我掌握了以下知识点:
- 树的递归处理:如村庄取暖问题中的状态递归设计。
- 栈的应用:包括括号校验与优惠计算问题中,利用栈进行回溯与辅助。
- 问题拆解:复杂问题可以通过分步解决,并结合工具逐步调试验证。
学习计划与工具应用
-
刷题计划:
- 每天从豆包 MarsCode AI 上选择一到两道不同类型的题目,涵盖树、数组、字符串、动态规划等方向。
- 定期复盘错题,理解常见的思维误区。
-
高效学习工具:
- 利用 AI 提供的题目推荐功能,覆盖全面知识点。
- 借助代码调试工具,在编写与运行中提升代码质量。
学习体验与反思
使用 AI 辅助刷题后,我不仅提高了解题速度,还更深入理解了算法思维。每当看到运行结果正确时,都能感受到学习的成就感。未来,我希望继续在 AI 的辅助下巩固基础,为更复杂的算法挑战做好准备!