问题描述
小F面临一个有趣的挑战:给定一个数组,她需要将数组中的数字分为两组。分组的目标是使得一组数字的和的个位数等于给定的 A,另一组数字的和的个位数等于给定的 B。除此之外,还有一种特殊情况允许其中一组为空,但剩余数字和的个位数必须等于 A 或 B。小F需要计算所有可能的划分方式。
例如,对于数组 [1, 1, 1] 和目标 A = 1,B = 2,可行的划分包括三种:每个 1 单独作为一组,其余两个 1 形成另一组。如果 A = 3,B = 5,当所有数字加和的个位数为 3 或 5 时,可以有一组为非空,另一组为空。
测试样例
样例1:
输入:
n = 3,A = 1,B = 2,array_a = [1, 1, 1]
输出:3
样例2:
输入:
n = 3,A = 3,B = 5,array_a = [1, 1, 1]
输出:1
样例3:
输入:
n = 2,A = 1,B = 1,array_a = [1, 1]
输出:2
样例4:
输入:
n = 5,A = 3,B = 7,array_a = [2, 3, 5, 7, 9]
输出:0
解题思路:
-
计算总和:首先,计算数组中所有元素的总和
totalSum。 -
生成所有子序列和:使用回溯法,遍历数组的所有子序列,计算每个子序列的和,并存入一个列表中,注意排除空子序列和整个数组的子序列。
-
检查条件:遍历所有生成的子序列和:
-
如果当前子序列和的个位数等于 AAA,且该和不是总和:
-
计算总和减去该和的个位数,判断是否等于 BBB。
-
-
处理特殊情况:如果总和的个位数等于 A 或 B,则计数器加 1。
-
返回计数:最终返回符合条件的分组数量。
代码实现
import java.util.ArrayList;
import java.util.List;
public class Main {
// 计算所有子序列的和
public static List<Integer> findAllSubsequenceSums(int[] array_a) {
List<Integer> sums = new ArrayList<>();
backtrack(array_a, 0, 0, 0, sums); // 添加一个参数表示当前子序列的大小
return sums;
}
// 回溯法生成所有子序列和
private static void backtrack(int[] array_a, int index, int currentSum, int size, List<Integer> sums) {
// 只在子序列非空时添加和
if (size > 0) {
sums.add(currentSum);
}
// 遍历每个元素,生成子序列
for (int i = index; i < array_a.length; i++) {
currentSum += array_a[i]; // 选择当前元素
backtrack(array_a, i + 1, currentSum, size + 1, sums); // 递归调用
currentSum -= array_a[i]; // 撤销选择
}
}
// 主要解决方案
public static int solution(int n, int A, int B, int[] array_a) {
int totalSum = 0;
for (int num : array_a) {
totalSum += num; // 计算总和
}
List<Integer> sums = findAllSubsequenceSums(array_a);
int count = 0;
// 遍历所有子序列和
for (int sum : sums) {
// 排除空子序列和整个原始序列的情况
if (sum % 10 == A && sum != totalSum) {
// 检查总和减去当前子序列和的个位数
if ((totalSum - sum) % 10 == B) {
count++; // 计数符合条件的分组
}
}
}
// 检查总和的个位数是否等于 A 或 B
if (totalSum % 10 == A || totalSum % 10 == B) {
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.数组元素是否全是正数,上面的代码考虑的全是正数。 2.如果元素范围是整数,那么需要计数的条件需要改变。