检查两个数组是否相似的Java代码
我在一个网站上遇到了这个编码问题。问题如下: 如果通过交换其中一个数组中最多一对元素可以从另一个数组中获得一个数组,则称这两个数组为相似数组 给定两个数组,检查它们是否相似 范例 对于A=[1,2,3]和B=[1,2,3],输出应该是 A相似(A,B)=真 数组是相等的,不需要交换任何元素 对于A=[1,2,3]和B=[2,1,3],输出应该是 A相似(A,B)=真 我们可以通过交换B中的2和1从A获得B 对于A=[1,2,2]和B=[2,1,1],输出应该是 A相似(A,B)=假 A或B中任意两个元素的任何交换都不会使A和B相等 这就是我给出的解决方案:检查两个数组是否相似的Java代码,java,arrays,Java,Arrays,我在一个网站上遇到了这个编码问题。问题如下: 如果通过交换其中一个数组中最多一对元素可以从另一个数组中获得一个数组,则称这两个数组为相似数组 给定两个数组,检查它们是否相似 范例 对于A=[1,2,3]和B=[1,2,3],输出应该是 A相似(A,B)=真 数组是相等的,不需要交换任何元素 对于A=[1,2,3]和B=[2,1,3],输出应该是 A相似(A,B)=真 我们可以通过交换B中的2和1从A获得B 对于A=[1,2,2]和B=[2,1,1],输出应该是 A相似(A,B)=假 A或B中任意
boolean areSimilar(int[] A, int[] B) {
if(A.length != B.length) return false;
int[] copyA = A, copyB = B;
Arrays.sort(copyA); Arrays.sort(copyB);
int countSwap = 0;
if(!Arrays.equals(copyA, copyB)) return false;
for(int i = 0; i < A.length; i++) {
if(A[i] != B[i]) countSwap++;
}
return (countSwap == 2 || countSwap == 0);
}
布尔相似(int[]A,int[]B){
如果(A.length!=B.length)返回false;
int[]copyA=A,copyB=B;
Arrays.sort(copyA);Arrays.sort(copyB);
int countSwap=0;
如果(!array.equals(copyA,copyB))返回false;
for(int i=0;i
此代码为以下阵列提供了正确的结果:
B:[1,2,3]
B:[2,1,3]
B:[2,1,1]
B:[1,2,3]
B:[1,10,2]
B:[1,3,2]
但每次我试图提交代码时,网站仍然显示“不正确”。它未能通过六个隐藏测试中的两个,我也不知道为什么。这是正确的代码吗?还有其他更简单的方法吗?您的代码无法工作,因为您在此处对原始数组进行了排序
copyA = A, copyB = B;
Arrays.sort(copyA); Arrays.sort(copyB);
然后比较排序的数组而不是原始数组,以检查它们是否可以仅使用一次交换进行转换
你应该这样做
boolean areSimilar(int[] A, int[] B) {
if(A.length != B.length) return false;
int countSwap = 0;
int[] copyA = Arrays.copyOf(A, A.length);
int[] copyB = Arrays.copyOf(B, B.length);
// checking both contain the same elements...
Arrays.sort(copyA); Arrays.sort(copyB);
if(!Arrays.equals(copyA, copyB)) return false;
// checking for min 2 swaps using original arrays...
for(int i = 0; i < A.length; i++) {
if(A[i] != B[i]) countSwap++;
}
return (countSwap == 2 || countSwap == 0);
}
布尔相似(int[]A,int[]B){
如果(A.length!=B.length)返回false;
int countSwap=0;
int[]copyA=Arrays.copyOf(A,A.length);
int[]copyB=Arrays.copyOf(B,B.length);
//正在检查两者是否包含相同的元素。。。
Arrays.sort(copyA);Arrays.sort(copyB);
如果(!array.equals(copyA,copyB))返回false;
//正在使用原始阵列检查至少2次交换。。。
for(int i=0;i
更有效的解决方案
boolean areSimilar(int[] A, int[] B) {
ArrayList<Integer> ids = new ArrayList<>();
for (int i = 0; i < A.length; i++) {
if ( A[i] != B[i] ) {
ids.add(i);
}
}
if (ids.size() == 0) {
return true;
}
if (ids.size() != 2) {
return false;
}
int id1 = ids.get(0);
int id2 = ids.get(1);
if (A[id1] == B[id2] && A[id2] == B[id1]) {
return true;
}
return false;
}
布尔相似(int[]A,int[]B){
ArrayList ID=新的ArrayList();
for(int i=0;i
程序中的问题
您没有创建和排序数组的副本,而是使用赋值
copyA = A
这意味着copyA
仍然是对原始数组的引用,因此,当您尝试计算交换时,原始数组将被排序
这意味着,当您尝试检查两个具有相同元素但有许多交换的数组时,当您应该得到false
时,您将得到true
应通过以下方式复制阵列:
A.clone()
Arrays.copyOf(A,A.length)
- 或
copyA=newint[A.length];System.arrayCopy(A,0,copyA,0,A.length)代码>
Set<Integer> setA = new HashSet<>(Arrays.asList(A));
Set<Integer> setB = new HashSet<>(Arrays.asList(B));
if ( ! setA.equals(setB) ) {
return false;
}
Set setA=newhashset(Arrays.asList(A));
Set setB=新的HashSet(Arrays.asList(B));
如果(!setA.equals(setB)){
返回false;
}
集合的equals
方法返回true
当且仅当两个集合包含完全相同的元素时(在集合中顺序无关紧要)
只有在保证数组不具有重复值的情况下,set方法才会起作用。频率图可以用于重复的阵列,但坦率地说,它是不可读的
线性方法
除了线性内存之外,由于排序的原因,您的方法需要O(n logn)。事实上,目前的问题可以在线性时间和恒定内存中解决
- 检查长度是否相等。如果不是,则返回false
- 设
为两个元素的数组,用于存在差异的位置的索引ind
- 循环数组(如您现在所做的)计算差异
- 如果遇到差异,如果
<2,将countSwap
放入i
,然后递增ind[countSwap]
countSwap
- 在循环结束时,如果
为0,则返回truecountSwap
- 如果
为1或大于2,则返回falsecountSwap
- 如果
为2,请检查保留的索引项。如果countSwap
和A[ind[0]==B[ind[1]]
,则返回A[ind[1]]==B[ind[0]]
,否则返回true
false
def areSimilar(a, b):
n = 0
if len(a)!=len(b):
return False
else:
for i in range(len(a)):
if a[i]!=b[i]:
n+=1
if n>2:
return False
if a[i] not in b:
return False
print(n)
return True