寻找可能的最大金额

时间:2017-01-16 21:54:23

标签: java arrays numbers

我有一些工作需要处理从两个数组中添加数字的问题。例如,如果输入是这样的:

array1
202 167 178 18
array2
467 15 98 3

程序会将它们配对在一起,在这种情况下,较大的数字会覆盖较小的数字,使它们无关紧要。然后它将所有大数字相加以获得总和。我已经解决了如何找到最小的总和,但最大的数额似乎要难得多。如上例所示,结果将是

467+202+167+178=1014

因为它们是四个最大的数字。(一对467与18,和202/167/178与其余任何一个) 我想过像

这样的东西
for(int n=numberofnumbers-1;n>n/2;n-=1)
{
     if(array1[n]>=array2[n])
     {
         anotherarray[n]=array1[n];
     }
     else
     {
         anotherarray[n]=array2[n];
     }
}

但它会多次使用一个数字,输出结果不正确。我需要一些帮助才能让它按照我想要的方式运作。

编辑:所需的输入:

array1
202 167 178 18
array2
467 15 98 3

期望的输出:

1014

我的非工作计划得到了什么:

1338

编辑2:数字从另一种方法排序。

编辑3:在看了一些建议之后,我想出了这个:

private int[] sorting(int[] dspeed,int[] pspeed)
{
int[] answer=new int[dspeed.length+pspeed.length];
int i=0, j=0, k=0;
while(i<dspeed.length&&j<pspeed.length)
    answer[k++]=dspeed[i]<pspeed[j] ? dspeed[i++] : pspeed[j++];

while(i<dspeed.length)
    answer[k++]=dspeed[i++];

while(j<pspeed.length)
    answer[k++]=pspeed[j++];

return answer;

}

假设array1是dspeed而array2是pspeed,还有

        final int[] ddspeed=sorting(dspeed, pspeed);
        int answer=0;
        for(int x=length-1;x>length/2;x--)
        {
            answer+=ddspeed[x];
        }
        System.out.println(answer);  
        break;

然而,我会得到没有意义的答案。 示例输入:

array1
1 2
array2
1 2

输出

0

4 个答案:

答案 0 :(得分:1)

最简单的方法是合并两个数组,对数组进行排序,然后添加数组的最后四个元素。显然,有更好的方法可以做到这一点,但因为我坚持你能理解的最简单的方法。 像这样:

import java.util.Arrays;

class Main {
  public static void main(String[] args) {
        int[] arr1 = { 202, 167, 178, 18 };
        int[] arr2 = { 467, 15, 98, 3 };
        int[] arr3 = new int[arr1.length+arr2.length];

        for(int i=0;i<arr1.length;i++)
            arr3[i]=arr1[i];

        for(int i=0;i<arr2.length;i++)
            arr3[arr1.length+i]=arr2[i];

        Arrays.sort(arr3);

        int len = arr3.length;

        int sum = arr3[len-1]+ arr3[len-2]+ arr3[len-3]+ arr3[len-4];
        System.out.println(sum);
  }
}

您明白了,您可以根据自己的要求进行修改。

答案 1 :(得分:0)

看看这段代码:

sum_max=0;
for(int n=0; n<array1.length; n++)
{
     if(array1[n]>=array2[n])
     {
         n_max=array1[n];
     }
     else
     {
         n_max=array2[n];
     }
     sum_max += n_max;
 }

即使我实际上没有测试它,我认为它应该做你想要的。

或者如果你想要它更短一些:

sum_max=0;
for(int n=0; n<array1.length; n++)
{
     n_max = (array1[n]>=array2[n]) ? array1[n] : array2[n];
     sum_max += n_max;
}

答案 2 :(得分:0)

如果我理解正确,规则如下:

  • 将数组1中的数字与数组2中的数字配对
  • 数字只能配对一次
  • 从每对中选择最大数字
  • 总结这些数字
  • 查找具有最大总和的对的组合

这意味着你想要使用每个数组中最大的数字求和。最简单的方法是对两个数组进行排序,一个是升序,一个是降序。现在按索引位置配对。

在Java中,对提升的基元数组进行排序很容易。只需使用Arrays.sort()

没有用于排序降序的方法,所以你可以对数组进行升序和反向排序,但也没有方法,尽管为此编写方法很容易。

我们只是按相反的顺序配对数字。

private static int highestSum(int[] array1, int[] array2) {
    if (array1.length != array2.length)
        throw new IllegalArgumentException();
    Arrays.sort(array1);
    Arrays.sort(array2);
    int sum = 0;
    for (int i = 0; i < array1.length; i++) {
        int value1 = array1[i];
        int value2 = array2[array2.length - i - 1];
        int max = Math.max(value1, value2);
        sum += max;
    }
    return sum;
}

测试

System.out.println(highestSum(new int[] { 202, 167, 178, 18, },
                              new int[] { 467, 15, 98, 3, }));

输出

1014

答案 3 :(得分:0)

Juust另一个方法:对两个数组进行排序。比较两个数组中的最大数字并将其作为总和。继续这个没有选择的元素,直到你有你的对。

sum_max=0;
Arrays.sort(arr1);
Arrays.sort(arr2);
n1=array1.length-1;
n2=n1;
count=n1;

while(count>=0)
{
    if(array1[n1]>=array2[n2])
     {
         n_max=array1[n1];
         n1--;
     }
     else
     {
         n_max=array2[n2];
         n2--;
     }
     sum_max += n_max;
     count--;
}