青训营X豆包MarsCode 技术训练营第五篇 | 豆包MarsCode AI 刷题

80 阅读4分钟

学习笔记:用 Java 刷题的心得与进步


学习方法与心得

在使用豆包 MarsCode AI 辅助 Java 刷题的过程中,我体会到了高效学习的意义。以下从学习方法、题目解析、知识总结与计划制定等方面分享我的心得。

学习方法:AI 辅助刷题

  1. 分阶段学习:先掌握题目所涉及的基础知识,再通过实际编程练习巩固。
  2. 错误驱动学习:每次解题后都会进行代码运行与调试。通过 AI 反馈明确自己的错误原因,深刻理解问题。
  3. 反复优化:在 AI 的引导下,尝试改进代码结构,例如减少冗余、提高可读性、优化性能。

题目解析一:村庄取暖问题

问题描述

已知一个二叉树代表村庄分布,每个节点需要暖炉覆盖。暖炉可以覆盖父节点、当前节点以及所有子节点。目标是计算需要最少暖炉数使村庄所有节点都被覆盖。

解题思路

  1. 构建二叉树:根据层次遍历数组生成二叉树。

  2. 状态设计

    • 0:节点未被覆盖。
    • 1:节点已被覆盖,但未安装暖炉。
    • 2:节点安装了暖炉。
  3. 递归处理:从叶节点往根节点逐层判断覆盖状态,结合安装暖炉的最优策略。

代码实现

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能获得的总优惠金额。

解题思路

  1. 倒序遍历:利用栈存储当前商品价格,逐步寻找符合条件的最近优惠。
  2. 计算优惠:对于每件商品,从栈中获取满足条件的价格,累加到优惠金额中。

代码实现

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
    }
}

题目解析三:括号字符串校验问题

问题描述

给定一个括号字符串,计算最少需要插入的括号数量以使其成为有效括号字符串。

解题思路

  1. 栈存储左括号:遇到右括号时尝试配对,若无可配对的左括号则需插入。
  2. 结果计算:遍历结束后,栈中未匹配的左括号数量加上需要插入的右括号数量即为最终结果。

代码实现

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
    }
}

知识总结

通过这几道题的学习,我掌握了以下知识点:

  1. 树的递归处理:如村庄取暖问题中的状态递归设计。
  2. 栈的应用:包括括号校验与优惠计算问题中,利用栈进行回溯与辅助。
  3. 问题拆解:复杂问题可以通过分步解决,并结合工具逐步调试验证。

学习计划与工具应用

  1. 刷题计划

    • 每天从豆包 MarsCode AI 上选择一到两道不同类型的题目,涵盖树、数组、字符串、动态规划等方向。
    • 定期复盘错题,理解常见的思维误区。
  2. 高效学习工具

    • 利用 AI 提供的题目推荐功能,覆盖全面知识点。
    • 借助代码调试工具,在编写与运行中提升代码质量。

学习体验与反思

使用 AI 辅助刷题后,我不仅提高了解题速度,还更深入理解了算法思维。每当看到运行结果正确时,都能感受到学习的成就感。未来,我希望继续在 AI 的辅助下巩固基础,为更复杂的算法挑战做好准备!