AI刷题心得 | 豆包MarsCode AI刷题

83 阅读5分钟

本文是我在用MarsCode刷题时碰到的一道有疑问的题目,我把它丢给AI分析,通过AI详细解释的帮助,我逐渐理解了这道题目

    public static int solution(int[] numbers) {
        // 将输入的数字组转换为字符串数组
        String[] numStrings = new String[numbers.length];
        for (int i = 0; i < numbers.length; i++) {
            numStrings[i] = String.valueOf(numbers[i]);
        }
        
        // 调用递归函数进行组合选择
        return countEvenSumCombinations(numStrings, 0, 0);
    }

    // 递归函数,用于计算符合条件的组合数
    private static int countEvenSumCombinations(String[] numStrings, int index, int currentSum) {
        // 如果已经选择了所有数字组中的数字
        if (index == numStrings.length) {
            // 判断当前和是否为偶数
            return (currentSum % 2 == 0) ? 1 : 0;
        }

        int count = 0;
        // 遍历当前数字组中的每个数字
        for (char digit : numStrings[index].toCharArray()) {
            // 将字符转换为数字
            int num = digit - '0';
            // 递归调用,选择下一个数字组中的数字
            count += countEvenSumCombinations(numStrings, index + 1, currentSum + num);
        }

        return count;
    }

    public static void main(String[] args) {
        // 测试用例
        System.out.println(solution(new int[]{123, 456, 789}) == 14);
        System.out.println(solution(new int[]{123456789}) == 4);
        System.out.println(solution(new int[]{14329, 7568}) == 10);
    }
}

帮我详细分析代码

好的,让我们详细分析一下你的代码。

代码结构

  1. Main 类:
    • solution 方法:这是主要的解决方案方法,负责将输入的数字组转换为字符串数组,并调用递归函数 countEvenSumCombinations 来计算符合条件的组合数。
    • countEvenSumCombinations 方法:这是一个递归函数,用于计算符合条件的组合数。
    • main 方法:包含测试用例,用于验证 solution 方法的正确性。

代码分析

solution 方法

public static int solution(int[] numbers) {
    // 将输入的数字组转换为字符串数组
    String[] numStrings = new String[numbers.length];
    for (int i = 0; i < numbers.length; i++) {
        numStrings[i] = String.valueOf(numbers[i]);
    }
    
    // 调用递归函数进行组合选择
    return countEvenSumCombinations(numStrings, 0, 0);
}
  • 功能:

    • 将输入的 int 数组 numbers 转换为字符串数组 numStrings
    • 调用递归函数 countEvenSumCombinations 来计算符合条件的组合数。
  • 细节:

    • String.valueOf(numbers[i]) 将整数转换为字符串。
    • countEvenSumCombinations(numStrings, 0, 0) 初始调用递归函数,初始索引 index 为 0,初始和 currentSum 为 0。

countEvenSumCombinations 方法

private static int countEvenSumCombinations(String[] numStrings, int index, int currentSum) {
    // 如果已经选择了所有数字组中的数字
    if (index == numStrings.length) {
        // 判断当前和是否为偶数
        return (currentSum % 2 == 0) ? 1 : 0;
    }

    int count = 0;
    // 遍历当前数字组中的每个数字
    for (char digit : numStrings[index].toCharArray()) {
        // 将字符转换为数字
        int num = digit - '0';
        // 递归调用,选择下一个数字组中的数字
        count += countEvenSumCombinations(numStrings, index + 1, currentSum + num);
    }

    return count;
}
  • 功能:

    • 递归地计算从每个数字组中选择一个数字,使得这些数字的和为偶数的组合数。
  • 细节:

    • 递归终止条件: 当 index 等于 numStrings.length 时,表示已经选择了所有数字组中的数字。此时检查 currentSum 是否为偶数,如果是则返回 1,否则返回 0。
    • 递归调用: 遍历当前数字组中的每个数字,将其转换为整数,并递归调用 countEvenSumCombinations 方法,更新 indexcurrentSum
    • 累加计数: 每次递归调用返回的结果累加到 count 中,最终返回 count

main 方法

public static void main(String[] args) {
    // 测试用例
    System.out.println(solution(new int[]{123, 456, 789}) == 14);
    System.out.println(solution(new int[]{123456789}) == 4);
    System.out.println(solution(new int[]{14329, 7568}) == 10);
}
  • 功能:

    • 包含三个测试用例,用于验证 solution 方法的正确性。
  • 细节:

    • 每个测试用例调用 solution 方法,并打印结果是否与预期结果相等。

总结

  • 优点:

    • 代码结构清晰,递归函数的设计合理,能够有效地计算符合条件的组合数。
    • 测试用例覆盖了不同的情况,有助于验证代码的正确性。
  • 潜在改进:

    • 可以考虑使用动态规划或其他优化方法来减少递归调用的次数,特别是在输入数据较大时。
    • 可以添加更多的测试用例,特别是边界情况,以确保代码的鲁棒性。

从以上AI的分析我们不难看出AI刷题有如下好处:

  • 快速理解题意:在面对复杂的题目描述时,AI 帮助解析能够迅速提炼出关键信息。例如,对于一些涉及到多个条件和复杂逻辑的算法题,AI 可以清晰地指出题目要求实现的功能,如在动态规划题目中,AI 能快速说明状态转移方程的构建思路,让用户不再被冗长的文字所困扰,从而更快地进入解题思考阶段。
  • 提供解题方向:当用户对题目毫无头绪时,AI 可以提供多种解题思路。以数据结构题目为例,若遇到一道关于图的遍历问题,AI 可能会给出深度优先搜索(DFS)和广度优先搜索(BFS)两种不同的思路,并简单介绍它们的适用场景和大致步骤。这就像在黑暗中为用户点亮了一盏灯,引导用户朝着正确的方向思考,避免用户盲目尝试而浪费大量时间。
  • 巩固基础知识:在解析过程中,AI 会关联到相关的基础知识。比如在解析一道排序算法题时,它会提及排序算法的基本原理,如比较操作、交换操作等,帮助用户回顾数组操作、循环等基础知识。这种关联式的解析可以加深用户对基础知识的理解和记忆,让用户明白每个知识点在实际问题中的应用。
  • 拓展知识边界:AI 还能够介绍一些高级的解题技巧或者优化方法。例如,在解析一道字符串匹配问题时,除了常规的暴力匹配方法,AI 可能会介绍 KMP(Knuth - Morris - Pratt)算法这种更高效的字符串匹配算法,包括它的原理、优势以及应用场景。这使得用户能够接触到更先进的知识,拓宽自己的知识视野。