2
public class symm
{


/* 
 * Returns true if array A is symmetric.
 * Returns false otherwise.
 * n is the number of elements A contains.
 *
 * The running time of your algorithm is O(  ).
 * You may add a brief explanation here if you wish.
 */

 public static boolean symmetric( int[] A, int n )
 {
 return symmHelper(A, n, 0);

 }

private static boolean symmHelper(int[] A, int n, int i) {
if(n==1)
    return true;
if((n==2) && (A[i] == A[n-1-i]))
    return true;
if((i == n-1-i) && (A[i] == A[n-1-i] ))
    return true;    

if(A[i] == A[n-1-i] && i < n/2 )
    return symmHelper(A, n, i+1);

return false;
}  


}  

テストケース: 適合を除くすべてのテストに合格しました。実行するたびに結果が得られません。問題は、真ん中に 2 が 2 つあることだと思います。コードについてはよくわかりませんが、単純化できると思います。実行時間は o(log n) ですか?

5 8 2 2 8 5 はい

10 7 50 16 20 16 50 7 10 はい

5 8 5 はい

1000 1000 はい

6000 はい

10 7 50 16 20 16 50 7 1000 いいえ

10 7 50 16 20 16 50 700 10 いいえ

10 7 50 16 20 16 5000 7 10 いいえ

10 7 50 16 20 1600 50 7 10 いいえ

10 7 50 16 1600 50 7 10 いいえ

4

5 に答える 5

2

複雑なコードはミスを増やします。したがって、それを単純化します。また、等式ではなく不等式を探します。すべてが正しいことを確認するよりも、1 つの間違いを確認する方が簡単です。

// A = array, n = size of array, i = looking at now
private static boolean symmHelper(int[] A, int n, int i) {

    if (i > n/2)     // If we're more than halfway without returning false yet, we win
        return true;

    else if (A[i] != A[n-1-i])    // If these two don't match, we lose
        return false;

    else    // If neither of those are the case, try again
        return symmHelper(A, n, i+1);
}

私の O() 表記が正しいことを覚えていれば、これは O(n+1) であるべきだと思います。+1 を削除するためにこれに加えることができる他の微調整がありますが、コードの実行が全体的に遅くなります。

于 2013-03-08T20:30:39.213 に答える
1
public static void main(String[] args) {
    // TODO Auto-generated method stub
    Scanner input = new Scanner(System.in);

    int N;
    int i;
    boolean sym = true;

    N=input.nextInt();
    int [] numbers = new int [N];

    for (i=0; i<N; i++){
        numbers[i]= input.nextInt();
    }
    for(i=0;i<N;i++){
        if(numbers[i]!= numbers[N-1-i]){
        sym=false;}
    }

   if(sym==true){
       System.out.println("The array is a symetrical array");
   }
   else{
       System.out.println("The array is NOT a symetrical array");
   }
}

}

于 2016-12-20T07:37:05.253 に答える
1
if(A[i] == A[n-1-i] && i < n/2 )

その行が問題です。偶数 > 2 の値を使用しているため、この行に到達すると、それよりも小さいのではなく、その時点で i = n/2 であるため、スキップされます。したがって、関数はそれをスキップして に進みreturn falseます。これを次のように変更すると問題ありません。

if(A[i] == A[n-1-i] && i <= n/2 )
于 2013-03-08T17:12:55.800 に答える
0

このチェックは役に立たない:

if((i == n-1-i) && (A[i] == A[n-1-i] ))
    return true;   

もちろん、2 つのインデックスが同じであれば、値は一致します。

また、これを 2 つに分割する必要があります。

if(A[i] == A[n-1-i] && i < n/2 )
    return symmHelper(A, n, i+1);

の場合は true を返しますi >= n/2

そうしないと、i > n/2 (配列が対称であることを既に知っていることを意味します) の後、if に入らずに false を返すことになり、これは間違っています。

于 2013-03-08T17:13:55.477 に答える
0
public static void main(String[] args) {
    // TODO Auto-generated method stub
    Scanner input = new Scanner(System.in);

    int N;
    int i;


    N=input.nextInt();
    int [] numbers = new int [N];

    for (i=0; i<N; i++){
        numbers[i]= input.nextInt();
    }
    i=0;
    while (i<N/2&& numbers[i] == numbers [N-1-i]){i++;
    }

   if(i==N/2){
       System.out.println("The array is a symetrical array");
   }
   else{
       System.out.println("The array is NOT a symetrical array");
   }
        }
于 2016-12-20T08:06:44.063 に答える