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,这是错误的。
测试用例: 我通过了所有的测试,当我没有跑步的时候,我认为问题是中间有两个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 否此检查无效: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
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;ipublicstaticvoidmain(String[]args){
//TODO自动生成的方法存根
扫描仪输入=新扫描仪(System.in);
int N;
int i;
布尔sym=真;
N=input.nextInt();
int[]数字=新的int[N];
对于(i=0;ipublicstaticvoidmain(String[]args){
//TODO自动生成的方法存根
扫描仪输入=新扫描仪(System.in);
int N;
int i;
N=input.nextInt();
int[]数字=新的int[N];
对于(i=0;ipublicstaticvoidmain(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表示法中多边形的最高幂才重要。