现在正在进行Foo Bar挑战赛,我接近达到3级。唯一阻止我的是单一案例失败,我无法确定。有人能看出为什么这段代码会失败吗?
期望的结果:如果我有一个数组说int [] x = {1,4,1};该程序应该获取该数组的子集,并找到其和为3的最大倍数的子集,并返回最大整数组合的子集。
发生了什么?:Google Foo.Bar正在给我
测试1通过了! 测试2通过了! 测试3通过了! 测试4通过了! 测试5失败。
我想知道导致此代码失败的原因。
下面'目的:
你有L,一个包含一些数字(0到9)的列表。写一个函数答案(L),它找到可以从这些数字中的一些或全部产生的最大数字,并且可以被3整除。如果不能产生这样的数字,则返回0作为答案。 L将包含1到9位数字。相同的数字可能会在列表中出现多次,但列表中的每个元素只能使用一次。
这里的代码可能很冗长,可以用更简单的方式完成:
public class Answer {
public static int answer(int[] l) {
int n = l.length;
int sum = 0;
int max =0;
int fragment = 0;
// Run a loop to get all subsets of an Array
for (int i = (1<<n)-1; i > 0; i--)
{
// Current subset
for (int j = 0; j < n; j++)
// (1<<j) is a number with jth bit 1
// so when we 'and' them with the
// subset number we get which numbers
// are present in the subset and which
// are not
if ((i & (1 << j)) > 0) {
sum+=l[j]; //Add the numbers of the subset together
fragment = 10*fragment + l[j]; //Get the numbers used to get the sum
}
//Taking Advantage of the divisible rules of 3, if the sum of a subset is a multiple of 3
if(sum%3 == 0) {
//Update the max multiple
if (max<fragment) {
max = fragment;
}
}
sum=0;
fragment = 0;
}
//Rearrange the max number order.
return getLargestNumber(max);
}
//Function to reaarange an integer to it's greatest combination
private static int getLargestNumber(int input) {
int[] numbers = new int[10];
for(int i = input; i != 0; i /= 10) {
numbers[i % 10]++;
}
int counter = 0;
long result = 0;
for (int i = 0; i < 10; counter += numbers[i++]) {
result += (int)((Math.pow(10, numbers[i]) * i - 1) / 9)
* Math.pow(10, counter);
}
return (int)result;
}
}
编辑:当我使用Arrays.sort对数组进行排序时,我通过了测试5,但现在测试3失败了。也许测试与数组的排列有关?