二分数字组合 | 豆包 MarsCode AI刷题

33 阅读3分钟

问题描述

小F面临一个有趣的挑战:给定一个数组,她需要将数组中的数字分为两组。分组的目标是使得一组数字的和的个位数等于给定的 A,另一组数字的和的个位数等于给定的 B。除此之外,还有一种特殊情况允许其中一组为空,但剩余数字和的个位数必须等于 A 或 B。小F需要计算所有可能的划分方式。

例如,对于数组 [1, 1, 1] 和目标 A = 1,B = 2,可行的划分包括三种:每个 1 单独作为一组,其余两个 1 形成另一组。如果 A = 3,B = 5,当所有数字加和的个位数为 3 或 5 时,可以有一组为非空,另一组为空。

解题代码

    public static int solution(int n, int A, int B, int[] array_a) {
        int count = 0;
        // 枚举所有可能的组合
        for (int mask = 0; mask < (1 << n); mask++) {
            int sum1 = 0, sum2 = 0;
            // 计算选中元素的和与未选中元素的和
            for (int i = 0; i < n; i++) {
                if ((mask & (1 << i)) != 0) {
                    sum1 += array_a[i];
                } else {
                    sum2 += array_a[i];
                }
            }
            // 检查条件
            if ((sum1 % 10 == A || sum1 == 0) && (sum2 % 10 == B || sum2 == 0)) {
                count++;
            }
        }
        return count;
    }

    public static void main(String[] args) {
        int[] array1 = {1, 1, 1};
        int[] array2 = {1, 1, 1};
        int[] array3 = {1, 1};

        System.out.println(solution(3, 1, 2, array1) == 3);
        System.out.println(solution(3, 3, 5, array2) == 1);
        System.out.println(solution(2, 1, 1, array3) == 2);
    }
}

知识点分析

位运算

位运算是一种对整数类型变量的二进制表示进行操作的运算。它包括以下几种基本操作:

  1. 按位与(AND): 对应位都为1时结果为1,否则为0。例如,5 AND 3的结果为1,因为5的二进制表示是1013的二进制表示是011,只有第一位同时为1。

  2. 按位或(OR): 对应位有一个为1时结果为1。例如,5 OR 3的结果为7,因为5的二进制表示是1013的二进制表示是011,第一位和第三位都有1。

  3. 按位异或(XOR): 对应位不同为1,相同为0。例如,5 XOR 3的结果为6,因为5的二进制表示是1013的二进制表示是011,第一位和第三位不同。

  4. 按位非(NOT): 对应位取反,即0变1,1变0。例如,NOT 5的结果为-6,因为5的二进制表示是101,取反后为010,即十进制的-6(假设是8位有符号整数)。

  5. 左移(Left Shift): 将一个数的所有位向左移动指定的位数,右边用0填充。例如,5 << 2的结果为20,因为5的二进制表示是101,左移两位后变为10100

  6. 右移(Right Shift): 将一个数的所有位向右移动指定的位数,左边用0填充(对于无符号数)或者用最高位的值填充(对于有符号数)。例如,5 >> 2的结果为1,因为5的二进制表示是101,右移两位后变为001

位运算在计算机科学中非常重要,因为它们通常比相应的算术运算更快,并且可以直接操作数据的位级表示。