数字分组求和+HTML概述 | 豆包MarsCode AI刷题

62 阅读4分钟

问题描述

我们需要从多个数字组中选择一个数字,构造出一个新的数字。目标是使得这个新数字的各位数字之和为偶数。输入是一个包含若干整数的数组,输出是满足这一条件的组合数量。

解决方案概述

本问题可以通过递归方法解决。递归是一种编程技术,它允许我们通过函数调用自身来解决问题。对于本问题,我们可以使用递归来遍历每个数字组,选择一个数字并计算这些选择的和,直到处理完所有组。最终,我们将检查得到的和是否为偶数,以此来计算满足条件的组合数量。

具体实现步骤

1. 输入处理

首先,我们需要将输入的整型数组(例如 [123, 456, 789])转换为字符串数组。这是因为我们希望能够逐个访问每个数字的位。对于每个数字,我们将其转换为字符串形式,使我们可以轻松地访问其中的每个字符。

String[] groups = new String[numbers.length];
for (int i = 0; i < numbers.length; i++) {
    groups[i] = String.valueOf(numbers[i]);
}

2. 递归函数定义

接下来,我们定义一个递归函数 countEvenSumCombinations,它将处理组合的逻辑。该函数接受三个参数:

  • 字符串数组 groups:存储所有数字组。
  • 整数 index:当前处理的数字组的索引。
  • 整数 currentSum:当前所选数字的和。

该函数的目标是遍历每个数字组,从中选择一个数字,并计算所有可能的组合和。

3. 递归终止条件

在递归函数内部,我们首先检查是否已处理完所有数字组。这个条件通过检查 index 是否等于 groups.length 来实现。如果是,则说明我们已经处理了所有组,此时检查 currentSum 是否为偶数:

if (index == groups.length) {
    return (currentSum % 2 == 0) ? 1 : 0;
}

如果 currentSum 为偶数,返回 1,表示找到了一种符合条件的组合;否则返回 0。

4. 遍历当前数字组

如果还没有处理完所有数字组,我们需要遍历当前数字组中的每个数字。使用 toCharArray() 方法将字符串转换为字符数组,从而允许我们逐个访问其中的字符:

for (char digit : groups[index].toCharArray()) {
    int num = Character.getNumericValue(digit);
    // 递归调用处理下一个组
    count += countEvenSumCombinations(groups, index + 1, currentSum + num);
}

在这个循环中,我们将字符转换为整型数字,并递归调用自身,更新索引和当前和。

5. 返回组合数量

在递归的最后阶段,我们将收集到的组合数量返回,最终在主方法中输出结果。

性能考虑

这种递归方法的时间复杂度是 O(N^M),其中 N 是每组数字的平均数量,M 是数字组的数量。尽管对于大数据量的输入可能会导致性能问题,但对于通常的输入规模,该方法仍然是可行的。

代码总结

综合上述逻辑,最终代码结构如下:

public class Main { 
    public static int solution(int[] numbers) {
        // 将数字转换为字符串,方便逐位处理
        String[] groups = new String[numbers.length];
        for (int i = 0; i < numbers.length; i++) {
            groups[i] = String.valueOf(numbers[i]);
        }
        
        // 调用递归函数
        return countEvenSumCombinations(groups, 0, 0);
    }

    private static int countEvenSumCombinations(String[] groups, int index, int currentSum) {
        // 检查是否到达末尾
        if (index == groups.length) {
            return (currentSum % 2 == 0) ? 1 : 0;
        }

        int count = 0;
        // 遍历当前组中的每个数字
        for (char digit : groups[index].toCharArray()) {
            int num = Character.getNumericValue(digit);
            count += countEvenSumCombinations(groups, 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);
    }
}

HTML概述整理:

今日总结:

1. 把 html 各个标签过了一遍,相当于复习了,但是标准这些一开始学的时候没有很在意,现在要根据文档改正自己的习惯也很困难。

2.刷题刷得比较艰难,写了半天cpp想起来不能提交,只能作罢。对JAVA语法很陌生,今天大部分都是借助AI完成的,但正好可以完善一下语法装备,也要磨炼一下自己最害怕的算法。