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

53 阅读5分钟

问题描述 小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 题目解析 思路 理解问题: 我们需要从每个数字组中选择一个数字,使得这些数字的和为偶数。 数字组是以字符串形式给出的,每个字符串代表一个数字组。 数据结构选择: 我们可以使用递归或回溯的方法来遍历所有可能的选择组合。 使用一个布尔数组来记录每个数字组中选择的数字是否为偶数。 算法步骤: 遍历每个数字组,检查每个数字的奇偶性。 使用递归或回溯来组合所有可能的选择,并计算它们的和。 如果和为偶数,则计数加一。 图解 假设我们有数字组 [123, 456, 789]: 初始状态: 数字组:[123, 456, 789] 当前和:0 递归遍历: 选择 1,递归到下一组 [456],当前和为 1。 选择 4,递归到下一组 [789],当前和为 5。 选择 7,递归到下一组,当前和为 12,符合条件,计数加一。 选择 8,递归到下一组,当前和为 13,不符合条件。 选择 9,递归到下一组,当前和为 14,符合条件,计数加一。 选择 2,递归到下一组 [456],当前和为 3。 选择 4,递归到下一组 [789],当前和为 7。 选择 7,递归到下一组,当前和为 14,符合条件,计数加一。 选择 8,递归到下一组,当前和为 15,不符合条件。 选择 9,递归到下一组,当前和为 16,符合条件,计数加一。 选择 3,递归到下一组 [456],当前和为 6。 选择 4,递归到下一组 [789],当前和为 10,符合条件,计数加一。 选择 5,递归到下一组,当前和为 11,不符合条件。 选择 6,递归到下一组,当前和为 12,符合条件,计数加一。 结果: 符合条件的组合数为 14。 代码详解 public class Main {     public static int solution(int[] numbers) {         // 将整数数组转换为字符串数组         String[] numStrings = new String[numbers.length];         for (int i = 0; i < numbers.length; i++) {             numStrings[i] = String.valueOf(numbers[i]);         }                 // 调用递归函数来计算符合条件的组合数         return countEvenSumCombinations(numStrings, 0, 0);     }

    private static int countEvenSumCombinations(String[] numStrings, int index, int currentSum) {         // 如果已经遍历完所有数字组         if (index == numStrings.length) {             // 检查当前和是否为偶数             return (currentSum % 2 == 0) ? 1 : 0;         }

        int count = 0;         // 遍历当前数字组中的每个数字         for (char digit : numStrings[index].toCharArray()) {             // 将字符转换为整数             int num = digit - '0';             // 递归调用,累加当前和             count += countEvenSumCombinations(numStrings, index + 1, currentSum + num);         }

        return count;     }

    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);     } } 知识总结 新知识点 递归与回溯: 递归是一种通过调用自身来解决问题的技术。 回溯是一种通过尝试所有可能的解决方案来解决问题的技术。 字符与整数的转换: 在Java中,字符可以通过减去字符 '0' 来转换为整数。 组合问题: 组合问题通常可以通过递归或回溯来解决。 学习建议 理解递归与回溯: 递归和回溯是解决组合问题的常用方法,理解它们的原理和应用场景非常重要。 练习字符与整数的转换: 在处理字符串时,经常需要将字符转换为整数,掌握这种转换方法可以提高代码的可读性和效率。 多做组合问题: 组合问题是算法题中的常见类型,多做这类题目可以提高解决问题的能力。 学习计划 高效学习方法 制定刷题计划: 每天固定时间刷题,保持持续性。 根据难度和类型制定计划,逐步提高难度。 利用错题进行针对性学习: 记录错题,分析错误原因。 针对性地复习和练习,避免重复犯错。 结合AI刷题功能: 利用AI提供的提示和解析,快速理解题目和解题思路。 通过AI的反馈,及时调整学习方法和策略。 工具运用 结合其他学习资源 在线课程: 结合在线课程学习算法和数据结构的基础知识。 书籍: 阅读经典算法书籍。 社区和论坛: 参与算法讨论,分享解题思路和经验。 学习建议 多练习: 通过大量练习,熟练掌握各种算法和数据结构。 多思考: 在解题过程中,多思考不同的解题思路和优化方法。 多总结: 定期总结学习经验和解题技巧,形成自己的知识体系。