一、做题思路
本题的目标是给定一组整数,通过将每个整数的每一位数字看作可选择的元素,生成所有可能的数字组合,然后判断每个组合所表示的数字各位数字之和是否为偶数,统计满足该条件的组合数量。
首先,需要将输入的整数数组中的每个整数转换为字符串形式,这样便于后续按位处理每个数字,将其拆分成单个数字字符来生成组合。
然后,通过递归的方式来生成所有可能的数字组合。在递归过程中,对于每个数字字符串的每一位字符(即原整数的每一位数字),都尝试将其加入到当前正在构建的组合中,并继续递归处理下一个数字字符串,直到处理完所有的数字字符串。
在递归的终止条件,即已经处理完所有数字字符串形成了一个完整的组合时,计算该组合所表示数字的各位数字之和,判断其是否为偶数,如果是则计数加一。
最后,返回满足条件的组合数量。
二、代码详解
// 判断一个数的各位数字之和是否为偶数
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的值。
- 首先通过一个循环遍历
-