AI刷题数字分组求偶和|豆包MarsCode AI刷题

41 阅读4分钟

问题解析

问题描述

小M有一组数字,每个数字由1到9的数字组成。这些数字被分成多个小组,每个小组可以看作一个数字(例如,[123, 456, 789])。小M需要从每个小组中选择一个数字,组成一个新的数字,目标使得这个新数字的各位数字之和为偶数

例如,对于输入 [123, 456, 789],符合条件的组合有 14 种:

  • 147, 149, 158, 167, 169, 248, 257, 259, 268, 347, 349, 358, 367, 369

解题思路

  1. 分组选择

    • 题目要求从每个数字组中选择一个数字,组合成一个新的数字。
    • 这是一个典型的组合问题,可以使用回溯算法(Backtracking)来解决。
  2. 条件判断

    • 目标是从每个数字组中选择一个数字,使得最终组合成的数字的各位数字之和为偶数
    • 在选择每个数字时,需要跟踪当前选择的数字的各位数字之和。
  3. 回溯算法

    • 递归选择:对于每个数字组,尝试选择其中的每个数字。
    • 累加和:在选择每个数字时,将该数字的各位数字之和累加到当前的总和中。
    • 递归终止条件
      • 当所有数字组都被处理完后,检查当前的总和是否为偶数。
      • 如果是,则计数器加一。
    • 回溯:选择完一个数字后,回溯到上一个状态,尝试选择下一个数字。
  4. 优化

    • 由于每个数字组的数字范围是1到9,可以使用位运算或其他优化方法,但回溯算法已经足够高效。

代码解析

public class Main {
    private static int count = 0; // 用于记录符合条件的组合数

    public static int solution(int[] numbers) {
        count = 0; // 重置计数器
        backtrack(numbers, 0, 0); // 从第一个数字组开始,初始和为0
        return count;
    }

    // 回溯函数
    private static void backtrack(int[] numbers, int index, int currentSum) {
        // 如果已经处理完所有数字组,检查当前和的各位数字之和是否为偶数
        if (index == numbers.length) {
            if ((currentSum % 10) % 2 == 0) { // 检查和的个位数字是否为偶数
                count++;
            }
            return;
        }

        // 从当前数字组中选择一个数字
        for (char digit : Integer.toString(numbers[index]).toCharArray()) {
            // 递归调用,处理下一个数字组,并更新当前和
            backtrack(numbers, index + 1, currentSum + (digit - '0'));
        }
    }

    public static void main(String[] args) {
        // 测试样例1
        System.out.println(solution(new int[]{123, 456, 789}) == 14); // 输出: true

        // 测试样例2
        System.out.println(solution(new int[]{123456789}) == 4); // 输出: true

        // 测试样例3
        System.out.println(solution(new int[]{14329, 7568}) == 10); // 输出: true
    }
}

代码说明

  1. 变量初始化

    • count:用于记录符合条件的组合数,初始值为 0
  2. 主函数 solution

    • 重置 count0
    • 调用回溯函数 backtrack,从第一个数字组开始,初始和为 0
    • 返回最终的 count 值。
  3. 回溯函数 backtrack

    • 参数
      • numbers:数字组数组。
      • index:当前处理的数字组的索引。
      • currentSum:当前选择的数字的各位数字之和。
    • 终止条件
      • index 等于 numbers.length 时,表示所有数字组都已处理完毕。
      • 检查 currentSum 的个位数字是否为偶数,如果是,则 count 加一。
    • 递归选择
      • 遍历当前数字组的每个数字(通过将数字转换为字符串,然后遍历字符)。
      • 递归调用 backtrack,处理下一个数字组,并更新 currentSum
  4. 测试样例

    • main 方法中,使用提供的测试样例验证代码的正确性。
    • 输出 true 表示结果与预期相符。

运行结果

运行上述代码,输出如下:

true
true
true

这表明对于每个测试样例,代码计算出的结果与预期结果一致。

总结

通过使用回溯算法,我们可以有效地计算出从每个数字组中选择一个数字,使得最终组合成的数字的各位数字之和为偶数的所有组合数。回溯算法在处理组合问题时非常有效,尤其适用于这种需要遍历所有可能组合的场景。