【发布时间】:2014-11-15 11:07:31
【问题描述】:
我是studying Codility chapter 2 : Counting elements。
我试着做这个练习,我认为我有一个很好的解决方案 O(n)。这是一个有效的解决方案吗? 是不是比课上提出的 BEST 方案更好?
问题:给定一个整数 m (1 ???? m ???? 1 000 000) 和两个非空、零索引的数组 A 和 B,其中包含 n 个整数, a0,a1,...,an−1 和 b0,b1,...,bn−1 分别为 (0 ???? ai,bi ???? m)。目的是检查是否存在可以对这些数组执行的交换操作,使得数组 A 中的元素之和等于交换后数组 B 中的元素之和。通过交换操作,我们的意思是从数组 A 中选择一个元素,然后 数组 B 中的一个元素并交换它们。
我用这些值测试了我的解决方案: int a[] = {2, 7, 12, 16}; int b[] = {4, 8, 9}; m = 16;
注意:我评论了 return 以查看交换的值。
public int resultat(int[] A, int B[], int max) {
int sumA = Arrays.stream(A).sum();
int sumB = Arrays.stream(B).sum();
int[] countA = count(A, max);
int[] countB = count(B, max);
int diff = sumA - sumB;
int diffMin = 0;
if (diff % 2 != 0) {
return -1;
}
diffMin = diff / 2;
if (sumA > sumB) {
if (diff < countA.length && diffMin < countB.length && countA[diff] != 0 && countB[diffMin] != 0) {
System.out.println("A:" + diff + "- B:" + diffMin);
//return 1;
}
} else {
if (diffMin < countA.length && diff < countB.length && countB[diff] != 0 && countA[diffMin] != 0) {
System.out.println("A:" + diffMin + "- B:" + diff);
//return 1;
}
}
return -1;
}
public int[] count(int[] X, int max) {
int[] p = new int[max + 1];
Arrays.fill(p, 0);
for (int i = 0; i < X.length; i++) {
p[X[i]] += 1;
}
return p;
}
【问题讨论】:
-
我用这些值测试了我的解决方案。你是怎么测试的,有没有使用java程序员经常使用的测试框架?
-
我没有为这种情况使用任何测试框架 java。我用我想要的值创建了一个类。我知道 Junit,我将尝试使用它。你能给我一个更好的框架吗?