3

私はいくつかのMITJava割り当てを練習しているだけです。しかし、2番目に大きい数を見つける方法がわかりません。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
  • 要素ごとに、配列全体を1回ループします。
    • 現在の要素が次よりも大きいかどうかを確認しますlargestValue
      • その場合は、に割り当てlargestValueてからsecondLargestValue、現在の要素をに割り当てlargestValueます(すべてを1つ下にシフトすると考えてください)
      • そうでない場合は、現在の要素がより大きいかどうかを確認しますsecondLargestValue
        • その場合、現在の要素をに割り当てますsecondLargestValue
        • そうでない場合は、何もしません。

O(n)実行時間

O(1)スペース要件

于 2012-11-13T01:24:06.380 に答える
3

順序統計を見つけるために配列をソートするだけでは無駄が多すぎます。2番目に大きい要素は、既存のアルゴリズムに似たアルゴリズムに従い、2番目に大きい数を表す追加の変数を使用して見つけることができます。

現在、次の要素は最大値よりも大きいか、最大値以下である可能性があるため、単一ifで十分です。

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

考慮すべき2つの変数がある場合、次の要素は次のようになります。

  • 最大値よりも大きい-最大値が2番目に大きくなり、次の要素が最大値になります
  • 最大値よりも小さいが、2番目に大きい要素よりも大きい-次の要素が2番目に大きい要素になります。

初期状態には特別な注意が必要です。最初の2つの項目を見て、大きい方をに割り当て、max小さい方を2番目に大きい項目に割り当てます。要素番号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

一般的に言えば:

「最大」と「notQuite」の2つの値があります。

両方を-9999などに初期化します。

リストをスキャンします。数値が「最大」より大きい場合は、「最大」をその数値に設定します。ただし、その前に、古い「最大」値を「notQuite」にコピーしてください。

一方、数値が「最大」よりも小さいが「notQuite」よりも大きい場合、「notQuite」をその数値に設定します。

すべての数値の調査が完了すると、「notQuite」には2番目に大きい数値が含まれます。

また、上記の数値を入力するときに、「largestIndex」と「notQuiteIndex」を保持し、対応する配列インデックス値を入力して、「勝者」の値を特定できることに注意してください。ただし、残念ながら、同一の「最大」または「secondLargest」の値が複数ある場合、単純なインデックススキームは機能せず、ある種のリストを保持する必要があります。

于 2012-11-13T01:23:04.827 に答える
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 に答える
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
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);
}

上記のコードは、重複したエントリ、負の値を持つ整数配列でテストされています。最大数と2番目に大きい数が1回のパスで取得されます。このコードは、配列に{8,8,8,8}のような同じ番号の複数のコピーのみが含まれている場合、または1つの番号しかない場合にのみ失敗します。

于 2017-05-30T12:14:14.090 に答える
0

また、最大数が2回発生した場合、および1つのforループで発生した場合は、2番目に大きい数を抽出します。

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

指定された配列で2番目に大きい要素を見つけます。

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 に答える
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 に答える