青训营-数字分组求偶数和

269 阅读4分钟

数字分组求偶数和

问题描述

小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++;  // 如果是奇数,增加奇数计数
    }
}
  • evensodds 分别用于统计当前数字组中的偶数和奇数个数。
  • 将数字 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;
}