java - Google Foobar power_hungry

标签 java python arrays computer-science

<分区>

你好,我需要帮助解决我的一个 Google 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();
    }
}

问题来了

您需要弄清楚任何给定阵列中的哪些面板组可以离线维修,同时仍保持每个阵列的最大功率输出量,为此,您首先需要弄清楚最大功率是多少每个数组的输出实际上是。编写一个函数 answer(xs),它接受一个表示数组中每个面板的功率输出水平的整数列表,并返回这些数字的某个非空子集的最大乘积。因此,例如,如果一个阵列包含功率输出水平为 [2、-3、1、0、-5] 的面板,则可以通过获取子集找到最大乘积:xs[0] = 2, xs[1 ] = -3, xs[4] = -5, 给出乘积 2*(-3)*(-5) = 30。所以 answer([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 结果变量。但是,我保留了另一个变量来跟踪“最大负整数”。最后将结果除以你的“最大负整数”变量,你就有了答案。

我记录了正整数和负整数的数量...希望这对您有所帮助。

关于java - Google Foobar power_hungry,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40107461/

相关文章:

python - 使用maven为aws lambda创建python部署包

python - 如何使用 f2py 将字符串数组传递给 Fortran 子例程

python - 如何选择n维数组中的值

arrays - 生成不重复的组合(排列)矩阵(数组超出最大数组大小首选项)

java - 将二次方程解析为命令行输入

python - 为什么 Django 让 Python 看起来很丑?

java - 创建的线程实例是驻留在堆中还是其他地方?

php - 获取 PHP 警告 array_sum() 期望参数 1 为数组,给定对象?

java - Java中如何将灰度图像转换为彩色图像?

java - 尝试在 java 中将 double 乘以 int