1

配列広告の大多数の要素を見つけようとしていますが、このコードは、サイズよりも小さい要素でチェックしているときに正常に機能しています。しかし、要素が配列のサイズと等しいときはいつでもarrayindexoutofbound例外が発生します。これを解決する方法を教えてください。

public class MajorityElement {
    public static void main(String[] args) {
        int a[]={2,2,7,5,2,2,6};
        printMajority(a, 7);
    }

    //1st condition to check if element is in majority.
    public static int findCandidate(int a[], int size){
        int maj_index=0;
        int count =1;
        int i;
        size=a.length;

        for(i=1;i<a.length;i++ ){
            if(a[maj_index]==a[i])
                count++;
            else
                count--;
            if(count==0)
            {
                maj_index=a[i];                      //current element takes max_inex position.
                count =1;
            }

        }

        return a[maj_index];
    }

    public static boolean isMajority(int a[], int size, int cand){
        int i, count =0;

        for(i=0;i<a.length;i++)
        {
            if(a[i]==cand)
                count++;
        }
        if(count>size/2){
            return true;
        }
        else {
            return false;
        }

    }

    private static void printMajority(int a[],int size){
        size=a.length;
        int cand=findCandidate( a, 7);

        if(isMajority(a,size,cand))
            System.out.printf("%d",cand);
        else
            System.out.println("no such element as majority");

    }
}
4

3 に答える 3

1

問題はmaj_index=a[i];ラインにあります。配列のセルの 1 つの値を取得し、それを割り当てて、maj_index後で配列のインデックスとして使用します (「 」を参照a[maj_index] == a[i])。したがって、その位置の値が配列のサイズよりも大きい場合、範囲外の状況が発生します。

これがあなたのコードです。特に、maj_indexインデックスと値の混同が起こらないように、変数を削除しました。for (int current : a)for-loopの代わりにfor-each ループも使用しましたfor(int i = 0; i < a.length; ++i)。最後に、sizeパラメーターを削除しました (渡す必要はありません。 を介して配列自体から推測できますa.length) 。

public class MajorityElement {

  // 1st condition to check if element is in majority.
  public static int findCandidate(int a[]) {
    int cand = a[0];
    int count = 1;

    for (int i = 1; i < a.length; i++) {
      if (cand == a[i])
        count++;
      else
        count--;
      if (count == 0) {
        cand = a[i];
        count = 1;
      }
    }
    return cand;
  }

  public static boolean isMajority(int a[], int cand) {
    int count = 0;

    for (int current : a) {
      if (current == cand)
        count++;
    }
    return count > a.length / 2;
  }

  private static void printMajority(int a[]) {
    int cand = findCandidate(a);
    if (isMajority(a, cand))
      System.out.printf("%d", cand);
    else
      System.out.println("no such element as majority");

  }

  public static void main(String[] args) {
    int a[] = { 9, 7, 9, 5, 5, 5, 9, 7, 9, 9, 9, 9, 7 };
    printMajority(a);
  }
}
于 2013-07-13T12:59:08.137 に答える
0

問題はあなたにあります:

for(i=1;i<a.length;i++ ){
            if(a[maj_index]==a[i])
                count++;
            else
                count--;
            if(count==0)
            {
                maj_index=a[i];                      //current element takes max_inex position.
                count =1;
            }

        }

        return a[maj_index];

ここでは、次のような値を取得しています:a[maj_index]テスト データ inta[]={2,1,8,8,8,8,6};の場合、要素 8 はメジャーですが、[maj_index] が無効であり、問​​題を引き起こしています。

代わりに、完全なコードは次のようになります。

public class TestMajor {

    /**
     * @param args
     */
    public static void main(String[] args) {
        int a[]={2,1,8,8,8,8,6};
        printMajority(a, 7);
    }

    //1st condition to check if element is in majority.
    public static int findCandidate(int a[], int size){
    int test = a[0];
        int count =1;
        int i;
        size=a.length;

        for(i=1;i<a.length;i++ ){
            if(test ==a[i])
                count++;
            else
                count--;
            if(count==0)
            {
            test =a[i];                      //current element takes max_inex position.
                count =1;
            }

        }

        return test;
    }

    public static boolean isMajority(int a[], int size, int cand){
        int i, count =0;

        for(i=0;i<a.length;i++)
        {
            if(a[i]==cand)
                count++;
        }
        if(count>size/2){
            return true;
        }
        else {
            return false;
        }

    }

    private static void printMajority(int a[],int size){
        size=a.length;
        int cand=findCandidate( a, 7);

        if(isMajority(a,size,cand))
            System.out.printf("%d",cand);
        else
            System.out.println("no such element as majority");

    }

}
于 2013-07-13T13:11:53.570 に答える