青训营X豆包MarsCode 技术训练营第(六)课 | 豆包MarsCode AI 刷题

84 阅读5分钟

给大家分享一下我最近刷的几道题的解析,还有我对 AI 助手的使用心得,这是第一次给大家分享的刷题解析和经验分享,这个系列预计有六期,今天给大家带来第六期的分享。

今天的第一题 —— 找出区间内小 C 最喜欢的数(偶数因子数量最多的数)

问题描述
小 C 特别喜欢偶数,且喜好程度取决于一个数中包含的偶数因子数量。具体而言,对于数 x,将其表示为若干因数相乘(如 x = p1 × p2 ×... × pk),若所有 p 都是偶数,那么因子的数量 k 就是小 C 对这个数的喜好程度。现在要找出在区间 [l, r] 中,哪个数是小 C 最喜欢的,即偶数因子数量最多的那个数。

测试样例
示例 1:
输入:l = 3, r = 10
输出:3
提示:小 C 最喜欢的数是 8,因数分解为 2 × 2 × 2,有 3 个偶数因子。

示例 2:
输入:l = 1, r = 16
输出:4
提示:小 C 最喜欢 16,因为 16 = 2 × 2 × 2 × 2,有 4 个偶数因子,在该区间中喜好程度最高。

示例 3:
输入:l = 10, r = 20
输出:4

解决方案
要解决这个问题,我们可以按照以下步骤进行:

  1. 遍历区间内的数:

    • 通过一个循环,让变量 i 从区间的下限 l 开始,每次递增 1,直到 i 等于区间的上限 r 为止。这样就能依次检查区间 [l, r] 内的每一个整数。
  2. 计算每个数的偶数因子数量:

    • 对于循环中的每一个整数 i,调用 countEvenFactors 方法来计算它的偶数因子数量。这个方法主要是通过不断地将数除以 2(因为 2 是最小的偶数质数,能整除说明有偶数因子),并记录能整除的次数,也就是偶数因子的数量。
  3. 比较并更新最喜欢的数:

    • 用变量 maxEvenFactors 记录当前找到的最大偶数因子数量,初始化为 0;用 favoriteNumber 记录小 C 最喜欢的数,初始化为区间下限 l。
    • 每当计算出一个数 i 的偶数因子数量 evenFactors 后,如果 evenFactors 大于 maxEvenFactors,就更新 maxEvenFactors 为 evenFactors 的值,并将 favoriteNumber 更新为 i,意味着找到了一个偶数因子数量更多的数,将其设为当前最喜欢的数。
  4. 返回最喜欢的数的偶数因子数量:

    • 在遍历完区间 [l, r] 内的所有数之后,maxEvenFactors 中存储的就是小 C 最喜欢的数(即偶数因子数量最多的数)的偶数因子数量,直接返回 maxEvenFactors 即可。

public class Main {
    public static int solution(int l, int r) {
        int maxEvenFactors = 0;
        int favoriteNumber = l;

        for (int i = l; i <= r; i++) {
            int evenFactors = countEvenFactors(i);
            if (evenFactors > maxEvenFactors) {
                maxEvenFactors = evenFactors;
                favoriteNumber = i;
            }
        }

        return maxEvenFactors;
    }

    // 计算一个数的质因数分解中2的个数
    private static int countEvenFactors(int num) {
        int count = 0;
        while (num % 2 == 0 && num > 0) {
            count++;
            num /= 2;
        }
        return count;
    }

    public static void main(String[] args) {
        System.out.println(solution(3, 10) == 3);
        System.out.println(solution(1, 16) == 4);
        System.out.println(solution(10, 20) == 4);
    }
}

代码功能概述
这段代码主要实现了在给定区间 [l, r] 内,找出小 C 最喜欢的数(即偶数因子数量最多的数)的偶数因子数量的功能。通过遍历区间内的每一个数,计算其偶数因子数量并与已记录的最大偶数因子数量进行比较,不断更新最喜欢的数及其对应的偶数因子数量,最后返回该数量。

代码细节

类定义与函数布局:

  • Main是一个包含solution方法的公开类。solution方法接收两个整数参数 l 和 r,分别表示区间的下限和上限,返回一个整数结果,即区间内小 C 最喜欢的数的偶数因子数量。

  • 还有一个私有静态方法 countEvenFactors,用于计算一个数的质因数分解中 2 的个数,也就是该数的偶数因子数量。

字符处理逻辑:

  • 在 countEvenFactors 方法中,通过不断判断数 num 是否能被 2 整除且大于 0,若能则将计数变量 count 加 1,并将 num 除以 2,以此来统计 2 作为因数出现的次数,即偶数因子数量。

结果拼接与返回:

  • 在 solution 方法中,每次比较一个数的偶数因子数量与当前最大偶数因子数量,若更大则更新相应的变量。最后返回 maxEvenFactors 作为最终结果。

核心逻辑
这段代码的核心在于通过遍历区间内的数并计算其偶数因子数量,然后进行比较和更新,从而找出偶数因子数量最多的数的偶数因子数量。由于需要遍历区间 [l, r] 内的每一个数,所以算法的时间复杂度为 O (r - l + 1),其中 r 是区间上限,l 是区间下限。

总结
这段代码以一种较为直接的方式实现了在给定区间内找出小 C 最喜欢的数的偶数因子数量的功能。通过合理运用循环、条件判断和简单的数学运算,使得代码逻辑清晰易懂,能够准确地完成任务。这不仅加深了我们对遍历、因数分解相关操作的理解,也让我们看到了如何在类似的根据特定条件寻找最优数的问题中运用这些基本的编程技巧。

我对 AI 助手的使用心得
在进行这道题的编程与算法学习的过程中,豆包 AI 助手依然是我重要的解题工具。当我在理解如何通过循环遍历区间内的数、计算偶数因子数量以及整个代码的逻辑流程时,AI 助手给我提供了清晰的解释和更多的参考思路。它帮助我更好地把握问题的关键所在,比如如何优化代码以提高效率等方面。AI 助手就像是一个随时在身边的导师,为我的学习和编程旅程提供了极大的便利与帮助,让我能更深入地探索编程知识和算法应用。希望我的这些体会能帮助到同样在编程之路上前行的朋友们!