【问题标题】:Compare numbers in array比较数组中的数字
【发布时间】:2016-04-26 20:14:18
【问题描述】:

我在 java 中有一个包含两个元素的数组。

我如何最好地决定是添加这些还是只选择其中一个(哪个?)以尽可能接近 1000?

我确实做错了什么,它总是将两个数字相加!

    if(myArray.length==2){
        int a = 1000-(myArray[0]);
        int b = 1000-(myArray[1]);
        int c = 1000-(myArray[0]+myArray[1]);

        if( (1000-a) < (1000-b)){
            if((a+b)<1000){
                bestAnswer = myArray[0]+myArray[1];
                }
                else{
                    bestAnswer = myArray[0];
                }
            }


        if( (1000-a) > (1000-b)){   
            if((a+b)<1000){
                bestAnswer = myArray[0]+myArray[1];
            }
                else{
                    bestAnswer = myArray[0];
                }
            }
        else{
            if((1000-(myArray[0]+myArray[1]))<(1000-(myArray[0]))){
                bestAnswer = myArray[0]+myArray[1];
            }
            else{
                bestAnswer = myArray[0];
            }
        }

【问题讨论】:

  • 你能举一些例子和输出期望吗?
  • 当然。如果第一个元素是 10,另一个是 20,我们必须将它们相加以尽可能接近 1000。如果一个是 999 另一个是 34 ,我们只需要第一个 999。注意:数组中的任何元素都不能超过 1000!
  • @SofiaEmilsson,为什么会有这样的限制,例如 { 999, 1010 } 是无效输入?在这种情况下,答案将是 999。限制是 所有 元素不能超过 1000,不是吗?
  • 理论上是的,但我的指令说:“数组中的每个元素都是小于或等于 1000 的正整数”
  • @SofiaEmilsson,啊,您在评论中添加了要求。

标签: java arrays compare


【解决方案1】:

您需要使用c的绝对值来捕捉c超过1000的用例。

int a = 1000-(myArray[0]);
int b = 1000-(myArray[1]);
int c = Math.abs(1000-(myArray[0]+myArray[1]));         

if( a < Math.min(b, c)) {
    bestAnswer = myArray[0];
}
else if(b < Math.min(a, c)) {
    bestAnswer = myArray[1];
}
else {
    bestAnswer = myArray[0]+myArray[1];
}

【讨论】:

  • 我会删除我的答案,没有想到ints 加起来会超过 1000 的情况。但是请记住,根据他的评论,@987654323 显然没有数组中的@s 可以超过 1000。所以你只需要使用绝对值来进行加法。
  • 我还注意到,如果它们的 int 相同,它将两者放在一起。我通过在比较中写
  • 这个解决方案能否适用于 n 个元素,而不仅仅是 2 个?看起来怎么样?
【解决方案2】:

给定两个正整数且小于或等于 1000,这应该可以工作。

myArray[0] = 80;
myArray[1] = 90
int c = myArray[0] + myArray[1];

bestAnswer = myArray[0]; // 80

if (myArray[1] > myArray[0]) { // 90 > 80? Yes.
    bestAnswer = myArray[1]; // bestAnswer = 90
} 
if (c > myArray[1] && c <= 1000) { // 170 > 90? Yes.
    bestAnswer = c; // 170 = bestAnswer.
}

【讨论】:

  • 第二个if看起来不错,但是如果myArray[0]=999和myArray[1]=800呢?那么 999 应该被选中,但是在这个算法中 800 是......?
  • 不知道你为什么会这么想。测试一下,自己看看。
  • 但我想说的是,如果 (myArray[1] > myArray[0]) = true,但它们仍然必须加在一起才能尽可能接近 1000 ?现在,如果 myArray[1] > myArray[0] 那么 myArray[1] 被选中
  • 是的,myArray[1] = bestAnswer 首先。但在第二个 if 语句之后,情况将不再如此。代码不会在第一个 if 语句之后终止。请在您选择的 IDE 中试用代码,您会发现它可以工作。
  • 200, -999 失败,当它应该是 200 时它返回 -799。然后她确实只说了正数,但是 eh
【解决方案3】:

试试这个

public class TestMain2 {

    public static void main(String[] args) {
        int a = 12;
        int b = 990;
        System.out.println(check(a,b));
    }

    public static String check(int a, int b) {
        String result = null;

        int aPlusBDiff = Math.abs(1000 - a - b);
        int aDiff = Math.abs(1000 - a);
        int bDiff = Math.abs(1000 - b);

        int min = Math.min(Math.min(aDiff, bDiff), aPlusBDiff);

        if(aPlusBDiff == min) {
            result = "Add both";
        } else if(aDiff == min) {
            result = "Choose A";
        } else {
            result = "Choose B";
        }

        return result;
    }
}

【讨论】:

    【解决方案4】:

    这是一个更精简的版本

     public static int getClosestToThousand(int a, int b) {
        int closestSoFar = Math.abs(a - 1000) < Math.abs(b - 1000) ? a : b;
        return Math.abs(closestSoFar - 1000) < Math.abs(a + b - 1000) ? closestSoFar : a + b;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多