小C的偶数喜好 | 豆包MarsCode AI刷题

55 阅读4分钟

问题分析

本题需要确定在给定区间 ([l, r]) 中,哪个数字包含最多的偶数因子。每个偶数因子的定义是该数可以被2整除的次数。例如,16可以写作 (2 \times 2 \times 2 \times 2),因此它包含4个偶数因子。

我们需要对区间内的每个数字进行处理,计算其偶数因子数量,并找到偶数因子数量最多的那个数。这种问题可以通过遍历和数学分解来解决,重点在于如何高效地计算每个数的偶数因子数量。


解题步骤

解决此问题需要以下几个步骤:

1. 理解偶数因子的概念

偶数因子指一个数可以被2连续整除的次数。例如:

  • (8 = 2 \times 2 \times 2),有3个偶数因子。
  • (16 = 2 \times 2 \times 2 \times 2),有4个偶数因子。

因此,对一个数 (x),我们可以通过反复除以2,直到它不能再被2整除来统计偶数因子的数量。


2. 实现偶数因子计数函数

我们可以用一个辅助函数 countEvenFactors(num) 来计算一个数的偶数因子数量。其逻辑如下:

  • 初始化计数器 (count = 0)。
  • 当 (num) 能被2整除时,将 (num) 除以2,同时增加 (count)。
  • 返回计数器 (count)。

这种方法的时间复杂度是 (O(\log(num))),因为每次除以2都会将数值减半。


3. 遍历区间并记录结果

接下来,我们在给定的区间 ([l, r]) 中,依次计算每个数字的偶数因子数量,并记录偶数因子数量最多的那个数字。具体逻辑如下:

  • 初始化两个变量:maxEvenFactors 用于存储最大偶数因子数量,favoriteNumber 用于存储对应的数字。
  • 遍历 ([l, r]) 中的每个数字 (i):
    • 计算 (i) 的偶数因子数量。
    • 如果当前偶数因子数量大于 maxEvenFactors,更新 maxEvenFactorsfavoriteNumber
  • 遍历结束后,favoriteNumber 就是偶数因子数量最多的那个数字,maxEvenFactors 是它的偶数因子数量。

4. 代码实现

以下是完整的 Java 代码实现:

public class Main {
    // 主函数,计算给定区间内偶数因子最多的数字
    public static int solution(int l, int r) {
        // 最大偶数因子数量
        int maxEvenFactors = 0;
        // 小C最喜欢的数字
        int favoriteNumber = l;

        // 遍历区间 [l, r]
        for (int i = l; i <= r; i++) {
            // 计算当前数字的偶数因子数量
            int evenFactors = countEvenFactors(i);
            // 更新最大偶数因子数量和对应数字
            if (evenFactors > maxEvenFactors) {
                maxEvenFactors = evenFactors;
                favoriteNumber = i;
            }
        }

        // 返回偶数因子最多的数字
        return maxEvenFactors;
    }

    // 计算一个数的偶数因子数量
    private static int countEvenFactors(int num) {
        int count = 0;
        // 不断除以2,直到不能整除为止
        while (num % 2 == 0) {
            count++;
            num /= 2;
        }
        return count;
    }

    // 测试用例
    public static void main(String[] args) {
        // 测试样例
        System.out.println(solution(3, 10) == 3); // 输出 3
        System.out.println(solution(1, 16) == 4); // 输出 4
        System.out.println(solution(10, 20) == 4); // 输出 4
    }
}

5. 算法复杂度分析

时间复杂度

  • 对于区间 ([l, r]),总共有 (r-l+1) 个数字。
  • 对于每个数字,我们最多需要执行 (O(\log(\text{num}))) 次除法操作。
  • 因此,总的时间复杂度是 [ O((r-l+1) \times \log(\max(l, r))) ] 其中 (\log(\max(l, r))) 是由于除法操作的复杂度。

空间复杂度

  • 该算法仅使用了常量级别的辅助变量,因此空间复杂度是 (O(1))。

6. 优化建议

虽然当前算法已经能够满足大多数情况下的需求,但对于极大范围的 ([l, r]),仍然可以优化:

  1. 跳过奇数:偶数因子只存在于偶数,因此在遍历时可以直接跳过所有奇数,从而将遍历数量减半。
  2. 预处理偶数因子数量:可以利用数组存储某个范围内所有数字的偶数因子数量,重复查询时效率更高。

总结

本题通过对区间内每个数字的偶数因子数量进行计算,并找到最大值对应的数字,解决了“小C最喜欢的数字”问题。算法的核心是利用数学分解高效地计算偶数因子,并在遍历中进行更新,最终得到结果。优化后的算法在效率和可扩展性方面表现优异,适用于更大范围的输入。