9

我试图从我的 int 数组中返回两个最大的整数。我能够返回最大和最小的罚款,但我无法让我的算法返回最大的两个。非常感谢您提供任何帮助。

请原谅我的代码中的任何错误。这是一个练习课,题目取自去年大学的考试材料。

这是我的代码:

public class TwoLargestIntsArray {

public static void main(String [] args){

    int [] values = new int[5];

    values[0] = 5;
    values[1] = 10;
    values[2] = 15;
    values[3] = 20;
    values[4] = 25;

    System.out.println(twoLargest(values));
    System.out.println();

}

public static int twoLargest(int values[]){

    int largestA = values[0];
    int largestB = values[0];

    for(int i = 0; i < values.length; i++){

            if(values[i] > largestA){
                largestA = values[i];
            }
            if(values[i] < largestA){
                largestB = values[i];   
            }

    }
    return largestA + largestB; 
}

}
4

16 回答 16

17

你可以写

public static int[] twoLargest(int values[]){
    int largestA = Integer.MIN_VALUE, largestB = Integer.MIN_VALUE;

    for(int value : values) {
        if(value > largestA) {
            largestB = largestA;
            largestA = value;
        } else if (value > largestB) {
            largestB = value;
        }
    }
    return new int[] { largestA, largestB }; 
}
于 2013-05-05T15:12:50.180 回答
9
public static void twoLargest(int values[]){

    int largestA = values[0];
    int largestB = -1;

    for(int i = 0; i < values.length; i++){

            if(values[i] > largestA){
                largestB = largestA;
                largestA = values[i];
            }
            else if (values[i] > largestB && values[i] != largestA) {
                largestB = values[i];
            }
    }
    System.out.println("Largest - " + largestA);
    System.out.println("2nd largest Largest - " + largestB);
}
于 2013-05-05T12:23:53.687 回答
1
public class Test
{

public static int[] findTwoHighestDistinctValues(int[] array)
{
    int max = Integer.MIN_VALUE;
    int secondMax = Integer.MIN_VALUE;
    for (int value:array)
    {
        if (value > max)
        {
            secondMax = max;
            max = value;
        }
        else if (value > secondMax && value < max)
        {
            secondMax = value;
        }
    }
    return new int[] { max, secondMax };
}

public static void main(String []args)
{
    int [] values = new int[5];
        values[0] = 5;
        values[1] = 10;
        values[2] = 15;
        values[3] = 20;
        values[4] = 25;
    int []ar = findTwoHighestDistinctValues(values);
    System.out.println("1 = "+ar[0]);
    System.out.println("2 = "+ar[1]);
}  
}

输出:

1 = 25

2 = 20

于 2014-09-29T11:17:10.037 回答
0

您不能让单个函数返回 2 个值。您要么必须将它们包装在一个数组中,要么使用引用参数。

于 2013-05-05T12:24:02.180 回答
0

传递要填充值的数组:

public static void twoLargest(int [] values, int [] ret){
    //...
    ret[0] = largestA;
    ret[1] = largestB;
}


int [] ret = new int [2];
twoLargest(values, ret);
// now ret[0] is largestA
// and ret[1] is largestB
于 2013-05-05T12:26:01.007 回答
0

试试这个:

public static int[] twoLargest(int values[]){

    int[] result = new int[2];
    int largestA = 0;
    int largestB = 0;

    for(int i = 0; i < values.length; i++){

            if(values[i] > largestA){
            largestB = largestA;
            largestA = values[i];
        }
    }
     result[0] = largestA;
     result[1] = largestB;

    return result; 
}
于 2013-05-05T12:29:58.503 回答
0

我假设它会帮助你,以防你能够从一个函数中获得最大的、第二大的、第三大的等等。我创造了这样一个:

public static int xLargest(int values[], int largeIndex)

只需传递数组和 largeIndex,最大的发送 1,第二大的发送 2,依此类推。

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class XLargestIntArray {

    public static void main(String[] args) {

        int[] values = new int[5];

        values[0] = 5;
        values[1] = 10;
        values[2] = 15;
        values[3] = 20;
        values[4] = 25;

        System.out.println(xLargest(values,2));
        System.out.println();

    }

    public static int xLargest(int values[], int largeIndex) {

        List<Integer> intList = new ArrayList<Integer>();
        for (int index = 0; index < values.length; index++) {
            intList.add(values[index]);
        }
        Collections.sort(intList);
        return intList.get(intList.size() - largeIndex);
    }
}
于 2013-05-05T12:35:27.217 回答
0

您还可以使用嵌套类来存储计算结果。例如:

  private static class Result {

    int largestA;
    int largestB;

    Result(int largestA, int largestB) {
        this.largestA = largestA;
        this.largestB = largestB;
    }
}

然后接收类似以下的数据:

Result result = twoLargest(values);
System.out.println(result.largestA);
System.out.println(result.largestB);
于 2013-05-05T12:40:54.243 回答
0

@Nilesh Jadav 的回答涵盖了所有情况。如果数组的最大值是最后一个元素,@Peter Lawrey 的回答会失败。例如 [10,2,5,1,8,20] 返回 20 和 8 以及接受的解决方案。

于 2014-10-22T17:26:30.220 回答
0
 public static void main(String[] args) {

    int[] numbers = new int[]{1, 2, 5, 4, 57, 54, 656, 4};
    int temp = numbers[0];
    int max = temp;
    int lastMax = temp;

    for (int index = 1; index < numbers.length; index++){
        int currentIndex = numbers[index];

        // check any time is it bigger than current maximum value
        max = Math.max(max, currentIndex);

        // if is grow up then should be max != temp; set old Max in last or 
        // is not group up but current index is bigger then last index update last max value
        lastMax = max != temp ? temp : Math.max(currentIndex, lastMax);

        temp = max;
    }

    System.out.println("Last max: " + lastMax);
    System.out.println("Max:" + max);
}
于 2017-08-24T13:25:47.173 回答
0
private static void printTwoMaxNumberWithoutSortMethod(int[] input) {
    int max=0,lastMax=0;
    lastMax=input[0];
    max=input[0];
    for(int i=1;i<input.length;i++)
    {
        if(lastMax<input[i] & max<input[i])
        {
            lastMax=max;
            max=input[i];

        }
    }
    System.out.println("lastMax="+lastMax+" : max="+max);

}
于 2017-12-27T08:30:52.577 回答
0
   //Java8&9 makes this easier with a cleaner code
   int[] numbers = new int[]{1, 2, 5, 4, 57, 54, 656, 4};       
    int maxSize = 2;
    Arrays.stream(numbers) //stream
    .boxed()  //to Integer Object
    .sorted(Comparator.reverseOrder()) //sorted
    .limit(maxSize )  //keep N values
    .forEach(System.out::println); 

注意。我们可以将此 astuce 与任何实现可比较的 bean 对象或通过使用相关的自定义比较器一起使用。

于 2018-02-10T23:31:06.500 回答
0
public class TwoLargestIntArray {


    public static void main(String [] args){

        int a[]  = new int[5];

        a[0] = 110;
        a[1] = 50;
        a[2] = 15;
        a[3] = 30;
        a[4] = 60;

        System.out.println(twoLargest(a));
        System.out.println();

    }

    public static int twoLargest(int a[]){

        int firstMax = 0;
        int secondMax = 0;

        for(int i = 0; i < a.length; i++){

                if(a[i]>firstMax) {
                    secondMax=firstMax;
                    firstMax = a[i];}
                    else if (a[i]>secondMax) {
                        secondMax= a[i];
                    }

                    }




        return  firstMax + secondMax; 
    }}
于 2018-08-17T07:25:00.070 回答
0

如果性能在这里不是问题,它不应该出现在小型阵列上,那么可以用更少的代码来完成。

最直接的解决方案是简单地对数组进行排序并返回它的最后一个值,并且在最后一个值旁边:

public static int[] twoLargest(int[] values) {
    Arrays.sort(values);
    return new int[]{values[values.length - 1], values[values.length - 2]};
}

上述代码的时间复杂度为O(n log (n)),如 Javadoc 中所述Arrays.sort()

实施说明:排序算法是 Vladimir Yaroslavskiy、Jon Bentley 和 Joshua Bloch 的 Dual-Pivot Quicksort。该算法在许多数据集上提供 O(n log(n)) 性能,导致其他快速排序降低到二次性能,并且通常比传统的(单轴)快速排序实现更快。

如果预期输入是一个少于两个元素的数组,则需要添加一些错误处理,例如抛出异常。

于 2018-08-23T18:54:07.417 回答
-1
public static int Compute(int _arrValues[]){

        int _intX = _arrValues[0];
        int _intY = _arrValues[1];

        for(int i = 2; i < _arrValues.length; i++){

                if(_arrValues[i] > _intX){
                    _intX= values[i];
                }
                else if(_arrValues[i] > _intY){
                    _intY = values[i];   
                }
        }
        return _intX + _intY; 
    }
于 2017-01-27T22:44:34.870 回答
-1

试试这个

int [] array1={10,2,5,1,8,20};

int largest= array1[0];

int seclargest=array1[0];

for (int i=1;i<array1.length;i++)
{
    if(largest <= array1[i])
    {
        seclargest=largest;
        largest=array1[i];  
    }   

}

System.out.println("largest and second largest are:" +largest + " " +seclargest);
于 2017-09-07T11:41:40.717 回答