1

配列内の最小の 3 つの整数の位置を見つけるにはどうすればよいですか? 私はそれを逆にしようとしましたが、3番目の数字を追加すると、すべてが地獄になります:p 誰かこれをやってのけて助けてくれますか? :)

編集:元の配列を変更またはソートせずにそれを行うとよいでしょう。

public static int[] lowerThree(int[] a)   {            
    int n = a.length;     
    if (n < 2) throw      
      new java.util.NoSuchElementException("a.length(" + n + ") < 2!");

    int m = 0;      // position for biggest
    int nm = 1;     // position for second biggest
    if (a[1] > a[0]) { m = 1; nm = 0; }
    int biggest = a[m];                // biggest value
    int secondbiggest = a[nm];           // second biggest
    for (int i = 2; i < n; i++) {
      if (a[i] > secondbiggest) {
        if (a[i] > biggest)   {
          nm = m;
          secondbiggest = biggest;     
          m = i;
          biggest = a[m];             
        }
        else    {
          nm = i;
          secondbiggest = a[nm];         
        }
      }
    } // for
    return new int[] {m,nm};   
}

編集:ここで何かを試しましたが、まだ機能しません。間違った出力と重複が発生します...

  public static int[] lowerthree(int[] a)    {
    int n= a.length;
    if(n < 3)
        throw new IllegalArgumentException("wrong");
    int m = 0;      
    int nm = 1;
    int nnm= 2;

    int smallest = a[m];                // 
    int secondsmallest = a[nm];           /
    int thirdsmallest= a[nnm];

    for(int i= 0; i< lengde; i++)   {
        if(a[i]< smallest)   {
            if(smalles< secondsmallest)  {
                if(secondsmallest< thirdsmallest)  {
                    nnm= nm;
                    thirdsmallest= secondsmallest;
                }
                nm= m;
                secondsmallest= smallest;
            }  
            m= i;
            smallest= a[m];
        }
        else if(a[i] < secondsmallest) {
            if(secondsmallest< thirdsmallest)  {
                    nnm= nm;
                    thirdsmallest= secondsmallest;
            }
            nm= i;
            secondsmallest= a[nm];
        }
        else if(a[i]< thirdsmallest)    {
            nnm= i;
            thirdsmallest= a[nnm];
        }
    }
    return new int[] {m, nm, nnm}; 
}
4

6 に答える 6

1

簡単に言えば、すべての新しい要素を手元にある 3 つの最大値と比較し、必要に応じてそれらを交換する必要があります (交換する場合は、3 つの最大値を再計算する必要があります)。

それぞれサイズ 3 の 2 つの配列を使用します。

  arrValues = [aV1  aV2  aV3]    (reals)
  arrPointers = [aP1  aP2  aP3]  (integers)

および 64 ビット整数型、それを呼び出しますmaxPointer

私は Java に詳しくないので、アルゴリズム ロジックの概要を説明します。

  Set arrValues = array[0] array[1] array[2]  (three first elements of your array)
  Set arrPointers = [0 1 2]   (or [1  2  3] if your array starts from 1)

  Iterate over the remaining elements. In each loop:

      Compare the Element scanned in this iteration with arrValues[maxPointer]
      If Element <= arrValues[maxPointer], 
                    remove the maxPointer element, 
                    find the new max element and reset the maxPointer
      Else
          scan next element
      End If
  Loop

終了時にarrPointersは、3 つの最小要素の位置が必要です。これが役立つことを願っていますか?

于 2013-09-16T21:58:37.767 に答える
1

これには最低 3 つの数字があり、いくつかのテストケースを追加する必要があります..しかし、ここにアイデアがあります

int[] arr = new int[3];
    arr[0] = list.get(0);

    if(list.get(1) <= arr[0]){
        int temp = arr[0];
        arr[0] = list.get(1);
        arr[1] = temp;
    }
    else{
        arr[1] = list.get(1);
    }

    if(list.get(2) < arr[1]){
        if(list.get(2) < arr[0]){
            arr[2] = arr[1];
            arr[1] = arr[0];
            arr[0] = list.get(2);
        }
        else{
            arr[2] = arr[1];
            arr[1] = list.get(2);
        }
    }else{
        arr[2] = list.get(2);
    }



    for(int integer = 3 ; integer < list.size() ; integer++){

        if(list.get(integer) < arr[0]){
            int temp = arr[0];
            arr[0] = list.get(integer);
            arr[2] = arr[1];
            arr[1] = temp;
        }
        else if(list.get(integer) < arr[1]){
            int temp = arr[1];
            arr[1] = list.get(integer);
            arr[2] = temp;
        }
        else if(list.get(integer) <= arr[2]){
            arr[2] = list.get(integer);
        }
    }
于 2013-09-16T21:28:45.103 に答える
0

配列内の 3 つの最小数の位置を見つける簡単な方法があります。

例 :

      int[] arr={3,5,1,2,9,7};
      int[] position=new int[arr.length];
      for(int i=0;i<arr.length;i++)
      {
         position[i]=i;
      }
      for(int i=0;i<arr.length;i++)
      {
        for(int j=i+1;j<arr.length;j++)
        {
          if(arr[i]>arr[j]){
          int temp=arr[i];
          arr[i]=arr[j];
          arr[j]=temp;

          int tem=position[i];
          position[i]=position[j];
          position[j]=tem;
          }
        }
      }
     System.out.println("Lowest numbers in ascending order");

     for(int i=0;i<arr.length;i++)
     {
       System.out.println(arr[i]);
     }

     System.out.println("And their previous positions ");

     for(int i=0;i<arr.length;i++)
     {
       System.out.println(position[i]);
     }

出力

ここに画像の説明を入力

于 2018-01-05T10:36:44.270 に答える