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;
}
}
测试用例: 我通过了所有测试ecxept最适合我每次运行时都没有,我认为问题在于中间有两个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 NO
10 7 50 16 20 16 50 700 10 NO
10 7 50 16 20 16 5000 7 10 NO
10 7 50 16 20 1600 50 7 10 NO
10 7 50 16 1600 50 7 10 NO
答案 0 :(得分:2)
复杂的代码会导致更多错误。因此,简化它。另外,寻找不平等而不是平等;检查一个错误比检查一切都更容易。
// 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,但这会使代码整体运行速度变慢。
答案 1 :(得分:1)
if(A[i] == A[n-1-i] && i < n/2 )
那条线就是问题所在。因为你使用偶数&gt; 2个值,当它到达这一行时它跳过它,因为在那一点我 = n / 2,而不是小于它。因此,该功能会跳过该功能并继续return false
。把它改成这个你应该没问题:
if(A[i] == A[n-1-i] && i <= n/2 )
答案 2 :(得分:0)
这项检查毫无用处:
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);
如果i >= n/2
,则返回true。
否则会发生的事情是在i&gt;之后n / 2(这意味着你已经知道你的数组是对称的),你不会进入那个,因此返回false,这是错误的。
答案 3 :(得分:0)
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");
}
}
}
答案 4 :(得分: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");
}
}