数字分组求偶数和
问题描述
小M面对一组从 1 到 9 的数字,这些数字被分成多个小组,并从每个小组中选择一个数字组成一个新的数。目标是使得这个新数的各位数字之和为偶数。任务是计算出有多少种不同的分组和选择方法可以达到这一目标。
numbers: 一个由多个整数字符串组成的列表,每个字符串可以视为一个数字组。小M需要从每个数字组中选择一个数字。
例如对于[123, 456, 789],14个符合条件的数为:147 149 158 167 169 248 257 259 268 347 349 358 367 369。
测试样例
样例1:
输入:
numbers = [123, 456, 789]
输出:14
样例2:
输入:
numbers = [123456789]
输出:4
样例3:
输入:
numbers = [14329, 7568]
输出:10
解题思路
初始化组合数
int even_combinations = 1; // 初始化为1,表示没有选择任何数字时的组合数
int odd_combinations = 0; // 初始化为0,表示没有选择数字时的奇数组合数
even_combinations表示当前所有可能的组合中,数字和为偶数的组合数,初始化为 1,因为不选任何数字的情况下,和为 0(偶数)。odd_combinations表示数字和为奇数的组合数,初始化为 0。
遍历每个数字组
for (const auto& number : numbers) {
- 这个
for循环遍历numbers向量中的每个数字,number是当前遍历到的数字。
统计偶数和奇数
int evens = 0; // 当前组中的偶数个数
int odds = 0; // 当前组中的奇数个数
std::string num_str = std::to_string(number);
for (char digit : num_str) {
if ((digit - '0') % 2 == 0) {
evens++; // 如果是偶数,增加偶数计数
} else {
odds++; // 如果是奇数,增加奇数计数
}
}
evens和odds分别用于统计当前数字组中的偶数和奇数个数。- 将数字
number转换为字符串,以便逐位检查每个数字。 - 内部的
for循环遍历字符串中的每个字符(每位数字),将字符转换为整数(digit - '0'),然后判断是偶数还是奇数。
更新组合数
cpp
复制代码
int new_even_combinations = even_combinations * evens + odd_combinations * odds;
int new_odd_combinations = even_combinations * odds + odd_combinations * evens;
even_combinations = new_even_combinations;
odd_combinations = new_odd_combinations;
-
计算新的组合数:
-
new_even_combinations:从当前的偶数组合数和奇数组合数来更新新的组合数。- 如果从之前的偶数组合中选出偶数,则和仍为偶数。
- 如果从之前的奇数组合中选出奇数,则和也为偶数。
-
new_odd_combinations:从当前组合中更新奇数组合数。- 如果从之前的偶数组合中选出奇数,则和为奇数。
- 如果从之前的奇数组合中选出偶数,则和也为奇数。
-
-
最后,将新的组合数更新为当前的组合数。
算法实现
#include <iostream>
#include <string>
#include <vector>
int solution(const std::vector<int>& numbers) {
int even_combinations = 1; // 初始化为1,表示没有选择任何数字时的组合数
int odd_combinations = 0; // 初始化为0,表示没有选择数字时的奇数组合数
// 遍历每个数字组
for (const auto& number : numbers) {
int evens = 0; // 当前组中的偶数个数
int odds = 0; // 当前组中的奇数个数
// 将数字转换为字符串,然后统计偶数和奇数
std::string num_str = std::to_string(number);
for (char digit : num_str) {
if ((digit - '0') % 2 == 0) {
evens++; // 如果是偶数,增加偶数计数
} else {
odds++; // 如果是奇数,增加奇数计数
}
}
// 更新组合数
int new_even_combinations = even_combinations * evens + odd_combinations * odds;
int new_odd_combinations = even_combinations * odds + odd_combinations * evens;
// 更新到下一个数字组
even_combinations = new_even_combinations;
odd_combinations = new_odd_combinations;
}
// 返回和为偶数的组合数
return even_combinations;
}
int main() {
// You can add more test cases here
std::cout << (solution({123, 456, 789}) == 14) << std::endl;
std::cout << (solution({123456789}) == 4) << std::endl;
std::cout << (solution({14329, 7568}) == 10) << std::endl;
return 0;
}