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

判断核心:递归实现组合型枚举

1. 处理数据

将每个给定的数字拆分成单个的数字放到一个vector里面去,最后用一个大的vector包含所有的数字组

int solution(vector<int> numbers){
  vector<vector<int>> digits;
  for(int num : numbers){
    vector<int> groupdigits;
    while(num > 0){
      groupdigits.push_back(num % 10);
      num /= 10;
    }
    digits.push_back(groupdigits);
  }
}

2.实现递归函数

这里有一个很大的问题,就是我原本是把递归函数写在外面,总的方案数cnt定义成全局,然后在solution里面调用递归函数。这样做的话执行单个输出语句都是对的,但是这道题是一次性执行完所有的样例。

也就是说之前的cnt会一直存在并且影响后面的递归 

于是我们需要每一次调用solution都有一个单独的cnt和单独的递归调用

那么问题就来了,我们如何在一个函数内部定义一个可以执行的函数,并且让它能访问并修改到外部的变量呢?

function<void(int,int)> backtrack = [&](int index, int sum){

}
  •  function<void(int,int)> 是用来声明backtrack的类型
  • [&](int index, int sum):lambda表达式

lambda 表达式,用于定义一个匿名函数,这个匿名函数就是实际被赋值给 backtrack 的可调用对象内容
[&] 表示这个 lambda 表达式通过引用捕获外部作用域中的变量。也就是说,在 lambda 表达式内部可以直接访问和修改它所在的外部函数作用域里的变量

 贴一个完整代码:

#include <functional>
#include <iostream>
#include <vector>

using namespace std;

int solution(vector<int> numbers) {
    vector<vector<int>> digits;
    // Please write your code here
    for(int num : numbers){
        vector<int> groupDigits;
        while(num > 0){
            groupDigits.push_back(num%10);
            num /= 10;
        }
        digits.push_back(groupDigits);
    }

    int cnt = 0;

    function<void(int, int)> backtrack = [&](int index, int sum){
        //已经选到最后一个数字组了
        if(index == digits.size()){
            if(sum % 2 == 0){
                cnt++;
            }
            return;
        }

        //如果没有选到最后一个数字组就会执行以下代码

        //枚举每一个数字组里面的数字
        for(int digit : digits[index]){
            //到下一个数字组里面去选数字
            //这里枚举是包含每个数字都被选的情况
            backtrack(index+1, sum+digit);
        }
    };

    backtrack(0, 0);
    return cnt;
}

int main() {
    // You can add more test cases here
    cout << solution({123, 456, 789})<< endl;
    cout << solution({123456789})<< endl;
    cout << solution({14329, 7568}) << endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值