3

我只是在练习一些 MIT Java 作业。但是,我不确定如何找到第二大数字。http://ocw.csail.mit.edu/f/13

  public class Marathon {
    public static void main(String[] arguments) {
        String[] names = { "Elena", "Thomas", "Hamilton", "Suzie", "Phil",
                "Matt", "Alex", "Emma", "John", "James", "Jane", "Emily",
                "Daniel", "Neda", "Aaron", "Kate" };

        int[] times = { 341, 273, 278, 329, 445, 402, 388, 275, 243, 334, 412,
                393, 299, 343, 317, 265 };

        for (int i = 0; i < names.length; i++) {
            System.out.println(names[i] + ": " + times[i]);
        }

        System.out.println();
        System.out.println("Largest Timing " + Largest(times));
        System.out.println();

    }

    public static int Largest(int[] times) {
        int maxValue = times[0];

        for (int i = 1; i < times.length; i++) {
            if (times[i] > maxValue) {
                maxValue = times[i];
            }
        }
        return maxValue;
    }

}
4

11 回答 11

7

您可以简单地执行以下操作,而不是对数组进行排序:

  • 保持一个largestValue和一个secondLargestValue
  • 对于每个元素,遍历整个数组一次:
    • 检查当前元素是否大于largestValue
      • 如果是这样,则分配largestValuesecondLargestValue,然后将当前元素分配给largestValue(将其视为将所有内容向下移动 1)
      • 如果不是,检查当前元素是否大于secondLargestValue
        • 如果是,则将当前元素分配给secondLargestValue
        • 如果没有,什么也不做。

O(n)运行时间

O(1)空间要求

于 2012-11-13T01:24:06.380 回答
3

简单地对数组进行排序以查找订单统计信息太浪费了。您可以按照与您已有的算法类似的算法找到第二大元素,并使用一个表示第二大数字的附加变量。

目前,下一个元素可能大于最大值或等于/小于最大值,因此单个元素就if足够了:

if (times[i] > maxValue) {
    maxValue = times[i];
}

考虑到两个变量,下一个元素可能是

  • 大于最大值- 最大值变为第二大,下一个元素变为最大值
  • 小于最大值但大于第二大- 下一个元素变为第二大。

必须特别注意初始状态。查看前两项,将较大的分配给max,将较小的分配给第二大;如果有元素,则从元素号 3 开始循环。

以下是您如何对其进行编码:

if (times[i] > maxValue) {
    secondLargest = maxValue;
    maxValue = times[i];
} else if (times[i] > secondLargest) {
    secondLargest = times[i];
}
于 2012-11-13T01:24:51.723 回答
2
private static int secLargest(int[] numbers) {
        int maxVal = 0;
        int nextMaxVal = 0;
        for (int i = 0; i < numbers.length; i++) {
            if (numbers[i] > maxVal) {
                nextMaxVal = maxVal;
                maxVal = numbers[i];

            }
            if (numbers[i] < maxVal) {
                nextMaxVal = maxVal;
                maxVal = numbers[i];

            }
        }
        return nextMaxVal;

    }
于 2015-02-03T07:15:26.503 回答
2

通常来说,一般来说:

有两个值——“最大”和“不完全”。

将两者都初始化为 -9999 或其他值。

浏览您的列表。如果数字大于“最大”,则将“最大”设置为该数字。但在你这样做之前,将旧的“最大”值复制到“notQuite”。

另一方面,如果该数字小于“最大”但大于“notQuite”,则将“notQuite”设置为该数字。

当您检查完所有数字后,“notQuite”包含第二大数字。

请注意,在填写上述数字时,您还可以保留“largestIndex”和“notQuiteIndex”,并用相应的数组索引值填写它们,以便识别“获胜”值。不幸的是,如果有多个相同的“最大”或“次大”值,简单的索引方案不起作用,您需要保留某种列表。

于 2012-11-13T01:23:04.827 回答
1
    private void secondLargest(int arr[]){

    int maxOne=arr[0];
    int maxTwo=arr[1];

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

        if(arr[i]>maxOne){

            maxTwo=maxOne;
            maxOne=arr[i];
        }else if (arr[i]>maxTwo) {

            maxTwo=arr[i];
        }

    }

    System.out.println(maxOne);
    System.out.println(maxTwo);
}
于 2014-06-26T10:55:39.493 回答
0

更新:更改为 Java。

class Main {
  public static void main(String[] args) {
    int a = Integer.MIN_VALUE;
    int b = Integer.MIN_VALUE;
    int[] arr = {44,6,43,8,9,-10,4,15,3,-30,23};

    for(int i=0; i < arr.length; i++){ 
        if( arr[i] > a || arr[i] > b ){
          if( a < b ) {
            a = arr[i];
          } else {
            b = arr[i];
          }
        }
    }  
    int secondLargest = a < b ? a : b;
    System.out.println(secondLargest);
  }
}
于 2014-07-26T11:50:28.640 回答
0

如果最大数字出现两次以及在单个 for 循环中,它还将提取第二大数字。

import java.util.*;
public class SecondLargestInArray
{
    public static void main(String[] args)
    {
        int arr[] = {99,14,46,47,86,92,52,48,36,66,85,92};
        int largest = arr[0];
        int secondLargest = arr[0];
        System.out.println("The given array is:" );
        for (int i = 0; i < arr.length; i++)
        {
            System.out.print(arr[i]+"\t");
        }

        for (int i = 0; i < arr.length; i++)
        {
            if (arr[i] > largest)
            {
                secondLargest = largest;
                largest = arr[i];
            }
            else if((arr[i]<largest && arr[i]>secondLargest) || largest==secondLargest)
            {
                secondLargest=arr[i];
            }
        }
        System.out.println("\nLargest number is:" + largest);
        System.out.println("\nSecond largest number is:" + secondLargest);
    }
}
于 2019-05-12T03:10:40.883 回答
0
public static void main (String args[]) {
    int [] arr = {1,4,3,10,4,8,20,5,33};
    int largest = 0;
    int secondLargest = 0;
    for (int x : arr) {
        if (x > largest) {
            secondLargest = largest;
            largest = x;
        }
        else if (x > secondLargest) {
            secondLargest = x;
        }
    }
    System.out.println("secondLargest:"+secondLargest);
}
于 2021-12-18T07:47:05.477 回答
0
int largest=time[0];
int secondLargest=largest;
for(int i=0;i<time.length;i++){
    if(time[i]>largest){
        secondLargest=largest;
        largest=time[i];
    }
    else if(secondLargest<time[i] && time[i]<largest || secondLargest>=largest)
        secondLargest=time[i];
}
return secondLargest;
于 2015-10-21T20:19:08.543 回答
0
public void findMax(int a[]) {
    int large = Integer.MIN_VALUE;
    int secondLarge = Integer.MIN_VALUE;
    for (int i = 0; i < a.length; i++) {
        if (large < a[i]) {
            secondLarge = large;
            large = a[i];
        } else if (a[i] > secondLarge) {
            if (a[i] != large) {
                secondLarge = a[i];
            }
        }
    }
    System.out.println("Large number " + large + " Second Large  number " + secondLarge);
}

上面的代码已经用具有重复条目、负值的整数数组进行了测试。一次检索最大数和第二大数。仅当数组仅包含相同数字的多个副本(例如 {8,8,8,8})或只有一个数字时,此代码才会失败。

于 2017-05-30T12:14:14.090 回答
0

查找给定数组中的第二大元素:

public static void findSecondMax(){
        int[] arr = {3, 2, 20, 4, 1, 9, 6, 3, 8};

        int max = 0;
        int secondMax = 0;

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

            if(max < arr[i]) max = arr[i];

            if((max > arr[i]) && (secondMax < arr[i])) secondMax = arr[i];

        }

        System.out.println(secondMax);
    }
于 2020-06-09T03:52:39.923 回答