0

1 番目、2 番目、3 番目に大きい配列を見つける必要があります。単純に並べ替えて、配列 [0]、配列 [1]、配列 [3] を返すことができることはわかっています。しかし問題は、値ではなくインデックスが必要なことです。たとえばfloat[] listx={8.0, 3.0, 4.0, 5.0, 9.0}、4、0、および 3 を返す必要がある場合。

ここに私が持っているコードがありますが、動作しません:

//declaration max1-3        
public void maxar (float[] listx){

    float maxel1=0;
    float maxel2=0;
    float maxel3=0;

    for (int i=0; i<listx.length; i++){
        if(maxel1<listx[i])
        {maxel1=listx[i];
        max1=i;
        }
    }
    listx[max1]=0; //to exclude this one in nextsearch

    for (int j=0; j<listx.length; j++){
        if(listx[j]>maxel2)
        {maxel2=listx[j];
        max2=j;
        }
    }
    listx[max2]=0;

    for (int k=0; k<listx.length; k++){
        if(listx[k]>maxel3)
        {maxel3=listx[k];
        max3=k;
        }
    }
}

私はmax1を正しく取得しますが、その後すべての要素が0になります。したがって、max2とmax3は0になります。このソリューションの何が問題なのか教えてください。ありがとうございました。

4

7 に答える 7

2

1 つのループを使用して 3 つの要素を見つけることができ、配列を変更する必要はありません。

新しい最大の要素に出くわしたら、前の最大の要素と前の 2 番目に大きい要素を 1 つ下にシフトする必要があります。

同様に、新しい 2 番目に大きい要素を見つけたら、にシフトする必要がありmaxel2ますmaxel3

3 つの変数を使用する代わりに、配列を使用することもできます。kこれにより、ロジックを合理化し、最大の要素に簡単に一般化することができます。

于 2012-12-01T18:50:58.480 に答える
0

配列を 3 回パスします。最初のパスでは値と最大要素の 1 番目のインデックスをM1見つけ、2 番目のパスM2ではそれより小さい最大要素の値と最初のインデックスをM1見つけ、3 番目のパスでは値/最初のインデックスを見つけますM3 < M2

于 2012-12-01T18:42:53.270 に答える
0

このコードを試してみてください:)

  public class Array
    {
  public void getMax( double ar[] )
   {
    double max1 = ar[0]; // Assume the first
    double max2 = ar[0]; // element in the array
    double max3 = ar[0]; // is the maximum element.
    int ZERO = 0; 
     // Variable to store inside it the index of the max value to set it to zero.

    for( int i = 0; i < ar.length; i++ )
    {
        if( ar[i] >= max1)
        {
            max1 = ar[i];
            ZERO = i;
        }
    }

    ar[ZERO] = 0; // Set the index contains the 1st max to ZERO.

    for( int j = 0; j < ar.length; j++ )
    {
        if( ar[j] >= max2 )
        {
            max2 = ar[j];
            ZERO = j;
        }
    }

    ar[ZERO] = 0; // Set the index contains the 2st max to ZERO.

    for( int k = 0; k < ar.length; k++ )
    {
        if( ar[k] >= max3 )
        {
            max3 = ar[k];
            ZERO = k;
        }
    }

            System.out.println("1st max:" + max1 + ", 2nd: " +max2 + ",3rd: "+ max3);                              
   }

public static void main(String[] args)
{
    // Creating an object from the class Array to be able to use its methods.
    Array array = new Array();
    // Creating an array of type double.
    double a[] = {2.2, 3.4, 5.5, 5.5, 6.6, 5.6};

    array.getMax( a ); // Calling the method that'll find the 1st max, 2nd max, and      and 3rd max.
}

  }
于 2012-12-01T18:53:15.397 に答える
0

最適化のために、3 つのパスではなく 1 つのパスを作成することをお勧めします。以下のコードは私にとってはうまくいきます。listxコードは、少なくとも 3 つの要素があることをアサートしないことに注意してください。含まれる要素が 2 つ以下の場合にどうするかは、あなた次第です。

このコードで私が気に入っているのは、配列に対して 1 回のパスしか実行しないことです。最良のケースでは、3 回のパスを実行する場合に比べて実行時間が短縮され、係数は の要素数に比例しlistxます。

i1 、i2、およびi3が の 3 つの最大要素のインデックスを格納し、i0最小要素を指すi1 、i2、およびi3のいずれかであるとします。最初は、最大の要素がまだ見つかっていないため、 i1 = i2 = i3です。i0 = i1とします。そのような新しいインデックスjが見つかった場合、 i0 = jを設定し、その古いインデックスをより大きな要素につながるインデックスに置き換えます。次に、安全に破棄できるように、i1、i2、およびi3の中から 3 つのうち最小の要素につながるインデックスを見つけます。listxlistx[j] > listx[i0]新しい大きな要素が登場した場合に備えて

: このコードは C で書かれているため、使用する場合は Java に変換してください。簡単にするために、同様の構文を使用するようにしました。(Java のテスト環境がなかったので C で書きました。)

void maxar(float listx[], int count) {
    int maxidx[3] = {0};

    /* The index of the 3rd greatest element
     * in listx.
     */
    int max_3rd = 0;

    for (int i = 0; i < count; i++) {
        if (listx[maxidx[max_3rd]] < listx[i]) {
            /* Exchange 3rd greatest element
             * with new greater element.
             */
            maxidx[max_3rd] = i;

            /* Find index of smallest maximum. */
            for (int j = (max_3rd + 1) % 3; j != max_3rd; j = (j + 1) % 3) {
                if (listx[maxidx[j]] < listx[maxidx[max_3rd]]) {
                    max_3rd = j;
                }
            }
        }
    }

    /* `maxidx' now contains the indices of
     * the 3 greatest values in `listx'.
     */

    printf("3 maximum elements (unordered):\n");
    for (int i = 0; i < 3; i++) {
        printf("index: %2d, element: %f\n", maxidx[i], listx[maxidx[i]]);
    }
}
于 2012-12-01T21:10:25.877 に答える
0
def third_mar_array(arr):
    max1=0
    max2=0
    max3=0
    for i in range(0,len(arr)-1):
         if max1<arr[i]:
             max1=arr[i]
             max_in1=i
    arr[max_in1]=0
    for j in range(0,len(arr)-1):
         if max2<arr[j]:
             max2=arr[j]
             max_in2=j
    arr[max_in2]=0
    for k in range(0,len(arr)-1):
         if max3<arr[k]:
             max3=arr[k]
             max_in3=k
    #arr[max_in3]=0
    return max3

n=[5,6,7,3,2,1]

f=first_array(n)
print f
于 2015-12-05T16:55:56.467 に答える