二分数字组合
问题描述
小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
public class Main {
public static int solution(int n, int A, int B, int[] array) {
// Please write your code here
//使用一个位运算解决该问题
int allSum = 0;
for(int i = 0; i < array.length; i++){
allSum = allSum + array[i];
}
//进行子集的遍历
int count = 0;
for(int i = 0; i < (int)Math.pow(2,array.length); i++){
int sum = 0;
for(int j = 0; j < array.length; j++){
if((i & (1<<j)) != 0){
sum = sum + array[j];
}
}
if(
((allSum - sum) % 10 == A && sum % 10 == B) ||
((allSum - sum) % 10 == A && sum == 0) ||
((allSum - sum) % 10 == B && sum == 0)
){
count ++;
}
}
// for(List<Integer> k : list){
// System.out.println(k);
// }
System.out.println(count);
return count;
}
public static void main(String[] args) {
// You can add more test cases here
int[] array1 = {1, 1, 1};
int[] array2 = {1, 1, 1};
int[] array3 = {1, 1};
int[] array4 = {17,5,6,8,1,7,5,14};
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);
System.out.println(solution(8, 6, 3, array4) == 1);
}
}
遇到的问题: 判断条件错误,条件判断将所有的可能出现的情况进行了枚举,造成重复,类似于:A = 4, B = 3进行了count + 1,然后A= 3 ,B = 4 也进行了count + 1;
标签:二分,字节,int,System,solution,青训营,println,array,out From: https://blog.csdn.net/yf3241610146/article/details/143464970