“数字分组偶数求和”题目要求
一、问题描述
小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
三、题目解析
3.1代码思路
- 拆分数字:将输入数组中的每个整数拆分成单个数字,并将这些数字存储在
groups列表中。 - 生成组合:编写
generateCombinations方法,通过调用该方法递归地生成所有可能的数字组合。generateCombinations方法从groups列表的第一个元素开始,逐个添加每个组中的数字到当前组合中,并递归地调用自身以添加下一个组的数字。 - 检查偶数和:对于每个生成的组合,计算其数字和,如果和为偶数,则计数
count。 - 返回结果:最终返回
count,即数字和为偶数的组合数量。
3.2详细代码
import java.util.Collections; // 添加这一行
import java.util.List;
public class Main {
public static int solution(int[] numbers) {
// 1. 将每个整数拆分成单个数字
List<List<Integer>> groups = new ArrayList<>();
for (int num : numbers) {
List<Integer> digits = new ArrayList<>();
// 拆分数字的逻辑
// 例如:123 -> [1, 2, 3]
while (num > 0) {
digits.add(num % 10);
num /= 10;
}
// 注意:digits 是倒序的,需要反转
Collections.reverse(digits);
groups.add(digits);
}
// 2. 生成所有可能的组合
List<List<Integer>> combinations = new ArrayList<>();
generateCombinations(groups, 0, new ArrayList<>(), combinations);
// 3. 检查每个组合的数字和是否为偶数
int count = 0;
for (List<Integer> combination : combinations) {
int sum = 0;
for (int digit : combination) {
sum += digit;
}
if (sum % 2 == 0) {
count++;
}
}
return count;
}
// 递归生成所有可能的组合
private static void generateCombinations(List<List<Integer>> groups, int index, List<Integer> current, List<List<Integer>> combinations) {
// 如果已经遍历完所有组,将当前组合加入结果集
if (index == groups.size()) {
combinations.add(new ArrayList<>(current));
return;
}
// 遍历当前组的每个数字
for (int digit : groups.get(index)) {
current.add(digit);
generateCombinations(groups, index + 1, current, combinations);
current.remove(current.size() - 1); // 回溯
}
}
public static void main(String[] args) {
// 测试用例
System.out.println(solution(new int[]{123, 456, 789}) == 14);
System.out.println(solution(new int[]{123456789}) == 4);
System.out.println(solution(new int[]{14329, 7568}) == 10);
}
}
四、知识总结
代码主要涉及到了数组和列表基本数据结构来对输入进行处理。核心代码是递归函数 generateCombinations 的调用。通过递归函数的使用,完成对所有数字组合的查找,进而完成偶数组合的筛选。因此,学会合理使用递归函数完成目标的排列组合问题相关题目是十分重要的。