Java 耗电巨大的谷歌foobar挑战在第四个测试用例中失败

Java 耗电巨大的谷歌foobar挑战在第四个测试用例中失败,java,arrays,Java,Arrays,我已经提交了测试,所以这没有违反堆栈溢出准则。 我一直在试图解决google foobar的这个问题,内容如下: 拉姆达指挥官的空间站很大。巨大的空间站需要很大的能量。配备世界末日装置的大型空间站需要更多的电力。为了帮助满足空间站的电力需求,Lambda指挥官在空间站的外表面安装了太阳能电池板。但该站位于类星体量子通量场的中间,这对太阳电池板造成巨大破坏。你和你的追随者团队已经被派去修理太阳能电池板,但是如果你能帮忙的话,你不想一下子把所有的电池板都拆下来,因为他们确实帮助空间站和所有的东西供电

我已经提交了测试,所以这没有违反堆栈溢出准则。 我一直在试图解决google foobar的这个问题,内容如下:

拉姆达指挥官的空间站很大。巨大的空间站需要很大的能量。配备世界末日装置的大型空间站需要更多的电力。为了帮助满足空间站的电力需求,Lambda指挥官在空间站的外表面安装了太阳能电池板。但该站位于类星体量子通量场的中间,这对太阳电池板造成巨大破坏。你和你的追随者团队已经被派去修理太阳能电池板,但是如果你能帮忙的话,你不想一下子把所有的电池板都拆下来,因为他们确实帮助空间站和所有的东西供电

您需要确定任何给定阵列中哪些面板组可以脱机修复,同时仍保持每个阵列的最大功率输出,为此,您首先需要确定每个阵列的最大输出实际是多少。编写一个函数解决方案(xs),它获取一个整数列表,这些整数表示数组中每个面板的功率输出级别,并返回这些数字的一些非空子集的最大乘积。因此,例如,如果一个阵列包含功率输出电平为[2,-3,1,0,-5]的面板,那么通过取子集xs[0]=2,xs[1]=-3,xs[4]=-5可以找到最大乘积,得到乘积2*(-3)*(-5)=30。所以解([2,-3,1,0,-5])将是“30”

每个太阳能电池板阵列包含至少1个且不超过50个电池板,每个电池板将具有绝对值不大于1000的功率输出水平(一些面板故障严重,导致能量耗尽,但您知道面板的波浪稳定器有一个技巧,可以将两个负输出面板组合在一起,以产生其功率值倍数的正输出)。最终产品可能非常大,因此请以数字的字符串表示形式给出解决方案

语言文字 要提供Python解决方案,请编辑solution.py 要提供Java解决方案,请编辑solution.Java

测试用例 您的代码应该通过以下测试用例。 注意,它也可以针对此处未显示的隐藏测试用例运行

--Python案例--
输入:
解决方案。解决方案([2,0,2,2,0])
输出:
八,

输入:
解决方案。解决方案([-2,-3,4,-5])
输出:
六十

--Java案例--
输入:
解决方案。解决方案({2,0,2,2,0})
输出:
八,

输入:
解决方案。解决方案({-2,-3,4,-5})
输出:
六十


我用Java编写了下面的代码

公共静态字符串解决方案(int[]xs){
//你的代码在这里
//对于(inti:xs)System.out.println(i);
int n=xs.length;
如果(n==1){
返回字符串.valueOf(xs[0]);
}
int neg=0,z=0,ans=1,m_neg=Integer.MIN_值;
for(int i:xs){
如果(ii)m_neg:i;
}
}
for(int i:xs){
如果(i==0){
z++;
继续;
}
如果(负%2==1&&i==m_负){
ans*=1;
}
否则{
ans*=i;
}
}
如果(z==n)返回“0”;
如果(负%2==1){
如果(neg==1&&z>0&&z+neg==n)返回“0”;
}
返回ans>0?字符串。valueOf(ans):“0”;
}
其中一个测试用例(准确地说是第四个)失败了。我尝试了各种边缘测试用例,但都无法通过。
有人能解释一下我遗漏了什么吗?

我的算法如下:

  • 对数组进行排序
  • 计算数组中的负整数数
  • 如果数组中有奇数个负整数,请保存最大负数的索引。(在数组
    {-2,-3,4,-5}
    中,最大的负整数是
    -2
  • 迭代数组并将所有元素相乘,跳过0(零)的元素并跳过最大的负整数(仅当数组中有奇数个负整数时)
  • /*
    导入java.math.biginger;
    导入java.util.array;
    */
    公共静态字符串解决方案(int[]xs){
    字符串结果=“0”;
    如果(xs!=null&&xs.length>0){
    if(xs.length==1&&xs[0]0){
    结果=product.toString();
    }
    }
    返回结果;
    }
    

    我使用
    biginger
    来存储结果,因为正如问题中所述,结果可能非常大。

    您可以使用单循环执行此操作:

    • 迭代数组
    • 保持与非零元素相乘
    • 同时保持跟踪最小值负整数
    • 如果最终乘积为负,则除以小值整数
    像这样:

    public class Test {
            public static void main(String[] args) throws Exception {
                int[] arr = {-2, -3, 4, -5};
                System.out.println(solution(arr));
            }
    
        public static String solution(int[] xs) {
            BigInteger ans = BigInteger.valueOf(1);
            int min = Integer.MIN_VALUE;
            for (int i = 0; i < xs.length; i++) {
                int j = xs[i];
                if(j>0) 
                    ans = ans.multiply(BigInteger.valueOf(j));
                else if(j<0) {
                    if(min<j) min = j;
                    ans = ans.multiply(BigInteger.valueOf(j));
                }
            }
            
            if(ans.compareTo(BigInteger.ZERO)<0) {
                ans = ans.divide(BigInteger.valueOf(min));
            }
            return ans.toString();
        }
    }
    

    注意:这只是一个演示。根据您的需要修复或改进代码。

    您的代码正在为
    解决方案生成
    60
    。解决方案({-2,-3,4,-5})
    。那么哪个测试用例失败了?有关于这个@onkarruikar隐藏测试用例的答案(第四个)失败。提到不能超过50个电池,最大绝对值为1000。因此,最大绝对功率不能超过50000,这属于int
    60