Java 检查数组是否对称 公共类symm { /* *如果数组A是对称的,则返回true。 *否则返回false。 *n是A包含的元素数。 * *算法的运行时间是O()。 *如果你愿意,你可以在这里添加一个简短的解释。 */ 公共静态布尔对称(int[]A,int n) { 返回symmHelper(A,n,0); } 私有静态布尔symmHelper(int[]A,int n,int i){ 如果(n==1) 返回true; 如果((n==2)和&(A[i]==A[n-1-i])) 返回true; 如果((i==n-1-i)&&(A[i]==A[n-1-i])) 返回true; 如果(A[i]==A[n-1-i]&&in/2之后(这意味着您已经知道您的数组是对称的),您不会进入if,因此返回false,这是错误的。

Java 检查数组是否对称 公共类symm { /* *如果数组A是对称的,则返回true。 *否则返回false。 *n是A包含的元素数。 * *算法的运行时间是O()。 *如果你愿意,你可以在这里添加一个简短的解释。 */ 公共静态布尔对称(int[]A,int n) { 返回symmHelper(A,n,0); } 私有静态布尔symmHelper(int[]A,int n,int i){ 如果(n==1) 返回true; 如果((n==2)和&(A[i]==A[n-1-i])) 返回true; 如果((i==n-1-i)&&(A[i]==A[n-1-i])) 返回true; 如果(A[i]==A[n-1-i]&&in/2之后(这意味着您已经知道您的数组是对称的),您不会进入if,因此返回false,这是错误的。,java,arrays,symmetric,Java,Arrays,Symmetric,测试用例: 我通过了所有的测试,当我没有跑步的时候,我认为问题是中间有两个2s。我对代码不是很确定,我认为它可以简化。 运行时间是否为o(日志n) 5 8 2 8 5 对 107 50 16 20 16 50 7 10 对 5 8 5 对 1000 1000 对 六千 对 107 50 16 20 16 50 7 1000 没有 10750162016070010 没有 107501620165000710 没有 107501620160050710 没有 107 50 16 1600 50 7

测试用例: 我通过了所有的测试,当我没有跑步的时候,我认为问题是中间有两个2s。我对代码不是很确定,我认为它可以简化。 运行时间是否为o(日志n)

5 8 2 8 5 对

107 50 16 20 16 50 7 10 对

5 8 5 对

1000 1000 对

六千 对

107 50 16 20 16 50 7 1000 没有

10750162016070010 没有

107501620165000710 没有

107501620160050710 没有

107 50 16 1600 50 7 10 否

此检查无效:

if(A[i] == A[n-1-i] && i <= n/2 )
当然,如果两个索引相同,那么它们的值将匹配

此外,如果将其一分为二,则需要将其拆分:

if((i == n-1-i) && (A[i] == A[n-1-i] ))
    return true;   
if(A[i]==A[n-1-i]&&i
如果
i>=n/2
,则返回true

否则,在i>n/2之后(这意味着您已经知道您的数组是对称的),您不会进入if,因此返回false,这是错误的。

此检查无效:

if(A[i] == A[n-1-i] && i <= n/2 )
当然,如果两个索引相同,那么它们的值将匹配

此外,如果将其一分为二,则需要将其拆分:

if((i == n-1-i) && (A[i] == A[n-1-i] ))
    return true;   
if(A[i]==A[n-1-i]&&i
如果
i>=n/2
,则返回true


否则,在i>n/2(这意味着您已经知道您的数组是对称的)之后,您不会进入if,因此返回false,这是错误的。

复杂代码会导致更多错误。因此,简化它。此外,寻找不平等而不是平等;检查一个错误要比检查所有事情是否正确容易得多

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

如果我没记错O()符号,我想应该是O(n+1)。您还可以对此进行其他调整以删除+1,但这会使代码整体运行速度变慢。

复杂的代码会导致更多错误。因此,简化它。此外,寻找不平等而不是平等;检查一个错误要比检查所有事情是否正确容易得多

if(A[i] == A[n-1-i] && i < n/2 )
    return symmHelper(A, n, i+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,但这会使代码整体运行较慢。

publicstaticvoidmain(String[]args){
// 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);
}
//TODO自动生成的方法存根 扫描仪输入=新扫描仪(System.in); int N; int i; 布尔sym=真; N=input.nextInt(); int[]数字=新的int[N]; 对于(i=0;i
publicstaticvoidmain(String[]args){
//TODO自动生成的方法存根
扫描仪输入=新扫描仪(System.in);
int N;
int i;
布尔sym=真;
N=input.nextInt();
int[]数字=新的int[N];
对于(i=0;i
publicstaticvoidmain(String[]args){
//TODO自动生成的方法存根
扫描仪输入=新扫描仪(System.in);
int N;
int i;
N=input.nextInt();
int[]数字=新的int[N];
对于(i=0;i
publicstaticvoidmain(String[]args){
//TODO自动生成的方法存根
扫描仪输入=新扫描仪(System.in);
int N;
int i;
N=input.nextInt();
int[]数字=新的int[N];

对于(i=0;iBut 5 8 2 8 5是对称的。向函数中添加一个print命令,以便每次通过递归可以看到i和n是什么。然后可以使用它来帮助遍历if()语句并查看每个语句何时触发。顺便说一句,此检查
if((i==n-1-i)&(a[i]==a[n-1-i]))return true;
是冗余的,如果(i==n-1-i)return true,则可以简化为
您甚至可以使用
|
操作符将此案例与
n==1
案例结合起来。@pamphlet哦,是的,我在下面看到了您的答案…@poplaines,是的,但我的输出是否定的:)但是5 8 2 8 5是对称的。向函数中添加一个print命令,以便每次通过递归都可以看到i和n是什么。然后可以使用它来帮助遍历if()语句,并查看每个语句何时触发。顺便说一句,此检查
if((i==n-1-i)&(a[i]==a[n-1-i])return true;
是冗余的,如果(i==n-1-i)return true,则可以简化为
您甚至可以使用
|
操作符将此案例与
n==1
案例结合起来。@pamphlet哦,是的,我在下面看到了您的答案…@poplaines,是的,但我的输出是否定的:)不是真的。事实是,如果
i>=n/2
@DiMono两者都不起作用,你应该返回true!问题正如你所说的,因为我使用的是偶数>2,我真的不知道如何处理它!不是真的。事实是,如果
i>=n/2
@DiMono两者都不起作用,你应该返回true!问题正如你所说的,因为我正在使用偶数>2,我真的不知道如何处理!如果我拆分它们,如果I>=n/2,它将返回true,即使对称的数组不是吗?如果我拆分它们,如果I>=n/2,它将返回true,即使对称的数组不是吗?@DiMono不是O(n+1)=O(n)。只有O表示法中多边形的最高幂才重要。@DiMono不是O(n+1)=O(n)。只有在O表示法中多边形的最高幂才重要。