java – Google Foobar power_hungry

你好,我需要一个谷歌foobar问题的帮助,这是我到目前为止所得到的.

package com.google.challenges;
import java.math.BigInteger;

public class Answer{


    public static String answer (int[] xs){
        BigInteger result = new BigInteger("1");
        int xsLen = xs.length, pos = 0;
        int[] negatives = new int[xsLen];
        if (xsLen == 1){
            return Integer.toString(xs[0]);
        }
        // Split the input up into pos/negative. Pos get put onto the final value, as they don't need anything else.
        // they are all useful. negative to onto seperate array and get sorted later
        for (int n = 0;n < xsLen;n++){
            int val = xs[n];
            if (val == 0){
                continue;
            }
            if (val > 0){
                result = result.multiply(new BigInteger(Integer.toString(val)));
            } else {
                negatives[pos] = val;
                pos++;
            }
        }
        // even number of negatives means a full product will always be positive.
        // odd number means that we discard the smallest number to maximise the result.
        if ((pos % 2) == 0){
            // even number, so add to result
            for (int i = 0;i < pos;i++){
                result = result.multiply(new BigInteger(Integer.toString(negatives[i])));
            }
        } else {
            // sort then discard the minimum
            int min = -1000; int mPos = -1;
            for (int i = 0;i < pos;i++){
                if(negatives[i] > min){
                    min = negatives[i];
                    mPos = i;
                }
            }
            for (int j = 0;j < pos;j++){
                if(j == mPos){
                    continue;
                }
                result = result.multiply(new BigInteger(Integer.toString(negatives[j])));
            }
        }

        // done, return the string;
        return result.toString();
    }
}

这是问题,

您需要弄清楚任何给定阵列中哪些面板可以离线修复,同时仍然保持每个阵列的最大功率输出,并且要做到这一点,您首先需要弄清楚每个阵列的最大输出.数组实际上是.编写一个函数答案(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

测试用例

Inputs:
    (int list) xs = [2, 0, 2, 2, 0]
Output:
    (string) "8"

Inputs:
    (int list) xs = [-2, -3, 4, -5]
Output:
    (string) "60"

我已经在这2天了,并且非常喜欢这个答案,所以我可以了解我做错了什么并改进了!感谢阅读,希望你回答. 🙂

最佳答案 你需要处理某些案件:

你的数组有1到50个整数元素,范围从-1000到1000.如果你的输入是这样的:[0,0,-43,0].在这种情况下,

    if (xsLen == 1){
        return Integer.toString(xs[0]);
    }

没有意义. (你不能得到否定的答案).在这种情况下,你的答案应为0.

解决这个问题的关键是要认识到你可以乘以两个负整数来得到一个正整数. BigInteger非常有用,因为您的最终答案可能非常大.

我实现解决方案的方法是将每个非零整数相乘,并将该值存储为BigInteger结果变量.但是,我保留了另一个变量来跟踪“最大的负整数”.最后将结果除以“最大负整数”变量,并得到答案.

我保留了正整数计数和负整数计数…希望这会有所帮助.

点赞