数字分组求偶数和的问题描述 小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 好的,让我们详细解释一下完整的代码实现。这个代码的目标是从多个数字组中选择一个数字,使得这些数字的和为偶数,并计算出有多少种不同的选择方法。
代码解释
import java.util.List;
import java.util.ArrayList;
public class Main {
public static int solution(List<String> numbers) {
// 将每个数字组拆分为单个数字
List<List<Integer>> groups = new ArrayList<>();
for (String numStr : numbers) {
List<Integer> group = new ArrayList<>();
// 将 numStr 拆分为单个数字并添加到 group 中
for (char c : numStr.toCharArray()) {
group.add(c - '0');
}
groups.add(group);
}
// 生成所有可能的组合并判断是否符合条件
int count = 0;
// 递归生成组合
count = generateCombinations(groups, 0, 0, count);
return count;
}
// 递归生成组合
private static int generateCombinations(List<List<Integer>> groups, int index, int currentSum, int count) {
// 如果当前组合的长度等于数字组的数量,判断是否符合条件
if (index == groups.size()) {
if (currentSum % 2 == 0) {
count++;
}
return count;
}
// 递归生成组合
for (int num : groups.get(index)) {
count = generateCombinations(groups, index + 1, currentSum + num, count);
}
return count;
}
public static void main(String[] args) {
// 测试用例
System.out.println(solution(List.of("123", "456", "789")) == 14);
System.out.println(solution(List.of("123456789")) == 4);
System.out.println(solution(List.of("14329", "7568")) == 10);
}
}
代码解释
- 输入参数类型:
solution方法的参数类型从int[]改为List<String>,更符合题目描述。 2.拆分数字组:在 solution 方法中,我们遍历 numbers 列表中的每个字符串,并将其拆分为单个数字,存储在 groups 列表中。例如,对于输入 ["123", "456", "789"],groups 将包含三个列表:[[1, 2, 3], [4, 5, 6], [7, 8, 9]]。递归生成组合: generateCombinations 方法用于递归生成所有可能的组合。 index 参数表示当前处理的数字组索引。 currentSum 参数表示当前组合的数字和。 count 参数用于记录符合条件的组合数量。递归终止条件:当 index 等于 groups 的大小(即所有数字组都已处理完毕),判断 currentSum 是否为偶数。如果是偶数,则 count 加 1。递归生成组合:对于当前数字组中的每个数字,递归调用 generateCombinations 方法,更新 index 和 currentSum,并继续生成组合。测试用例:在 main 方法中,我们使用 List.of 方法创建测试用例,并调用 solution 方法进行测试。总结这个代码通过递归生成所有可能的组合,并在递归过程中判断当前组合的和是否为偶数。通过这种方式,我们可以有效地计算出符合条件的组合数量。