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

37 阅读4分钟

一、做题思路

本题的目标是给定一组整数,通过将每个整数的每一位数字看作可选择的元素,生成所有可能的数字组合,然后判断每个组合所表示的数字各位数字之和是否为偶数,统计满足该条件的组合数量。

首先,需要将输入的整数数组中的每个整数转换为字符串形式,这样便于后续按位处理每个数字,将其拆分成单个数字字符来生成组合。

然后,通过递归的方式来生成所有可能的数字组合。在递归过程中,对于每个数字字符串的每一位字符(即原整数的每一位数字),都尝试将其加入到当前正在构建的组合中,并继续递归处理下一个数字字符串,直到处理完所有的数字字符串。

在递归的终止条件,即已经处理完所有数字字符串形成了一个完整的组合时,计算该组合所表示数字的各位数字之和,判断其是否为偶数,如果是则计数加一。

最后,返回满足条件的组合数量。

二、代码详解

// 判断一个数的各位数字之和是否为偶数
bool isEvenSum(int num) {
    int sum = 0;
    while (num > 0) {
        sum += num % 10;
        num /= 10;
    }
    return sum % 2 == 0;
}

isEvenSum函数:

功能:接受一个整数 num,计算其各位数字之和,并判断该和是否为偶数。 实现:通过一个 while 循环,每次取 num 的个位数字(num % 10)累加到 sum 中,然后将 num 缩小 10 倍(num /= 10),直到 num 变为 0,此时 sum 即为各位数字之和,最后返回 sum % 2 == 0 的结果,即判断和是否为偶数。

// 递归函数,用于生成所有可能的组合并计算符合条件的组合数
void generateCombinations(const std::vector<std::string>& groups, int index, int currentNum, int& count) {
    if (index == groups.size()) {
        if (isEvenSum(currentNum)) {
            count++;
        }
        return;
    }

    for (char digit : groups[index]) {
        generateCombinations(groups, index + 1, currentNum * 10 + (digit - '0'), count);
    }
}
  • generateCombinations 函数:

    • 参数:

      • groups:是一个存储了将输入整数转换为字符串后的数组的常量引用,代表了所有可供组合的数字字符分组。
      • index:表示当前正在处理的 groups 中的字符串索引,用于控制递归的进度。
      • currentNum:记录当前正在构建的组合所表示的数字,初始值为 0,在递归过程中逐步更新。
      • count:是一个引用参数,用于统计满足各位数字之和为偶数条件的组合数量。
    • 功能:通过递归生成所有可能的数字组合,并在组合完成时判断是否满足各位数字之和为偶数的条件,若满足则增加计数。

    • 实现:

      • 首先判断 index 是否等于 groups.size(),如果相等,说明已经处理完了所有的数字字符串,形成了一个完整的组合。此时调用 isEvenSum 函数判断 currentNum 的各位数字之和是否为偶数,如果是则将 count 加一,然后返回。
      • 如果 index 不等于 groups.size(),则遍历当前 groups[index] 字符串中的每一个字符 digit。对于每个字符,将其转换为对应的数字(digit - '0')并加入到当前组合 currentNum 中(通过 currentNum * 10 + (digit - '0') 更新 currentNum),然后递归调用自身,将 index 加一,继续生成下一层的组合。
int solution(std::vector<int> numbers) {
    // 将每个数字转换为字符串,方便后续处理
    std::vector<std::string> groups;
    for (int num : numbers) {
        groups.push_back(std::to_string(num));
    }

    int count = 0;
    generateCombinations(groups, 0, 0, count);
    return count;
}
  • solution 函数:

    • 参数:numbers 是输入的整数向量。

    • 功能:是整个问题的核心解决函数,它先将输入的整数向量中的每个整数转换为字符串形式存储在 groups 向量中,然后调用 generateCombinations 函数来生成所有可能的组合并统计满足条件的组合数量,最后返回该计数。

    • 实现:

      • 首先通过一个循环遍历 numbers 向量中的每个整数 num,使用 std::to_string 函数将其转换为字符串,并将字符串添加到 groups 向量中。
      • 接着初始化一个计数变量 count 为 0,然后调用 generateCombinations 函数,传入 groups、初始索引 0、初始组合数字 0 以及 count 的引用,开始生成组合并计数的过程。最后返回 count 的值。