我从一个网站得到了这个编码问题。问题如下所示:
如果一个数组可以通过在其中一个数组中交换最多一对元素而获得,则称它们为相似的数组。给定两个数组,请检查它们是否相似。
例如,对于A = [1、2、3]和B = [1、2、3],输出应该是areSimilar(A,B)= true。 这些数组相等,不需要交换任何元素。
对于A = [1、2、3]和B = [2、1、3],输出应该是areSimilar(A,B)= true。 我们可以通过在B中交换2和1来从A中获得B。
对于A = [1、2、2]和B = [2、1、1],输出应该是areSimilar(A,B)= false。 无论在A中还是在B中交换任意两个元素都不会使A和B相等。
这是我提供的解决方案:
如果一个数组可以通过在其中一个数组中交换最多一对元素而获得,则称它们为相似的数组。给定两个数组,请检查它们是否相似。
例如,对于A = [1、2、3]和B = [1、2、3],输出应该是areSimilar(A,B)= true。 这些数组相等,不需要交换任何元素。
对于A = [1、2、3]和B = [2、1、3],输出应该是areSimilar(A,B)= true。 我们可以通过在B中交换2和1来从A中获得B。
对于A = [1、2、2]和B = [2、1、1],输出应该是areSimilar(A,B)= false。 无论在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);
}
这段代码对以下数组给出了正确的结果:
A: [1, 2, 3]
B: [1, 2, 3]A: [1, 2, 3]
B: [2, 1, 3]A: [1, 2, 2]
B: [2, 1, 1]A: [1, 1, 4]
B: [1, 2, 3]A: [1, 2, 3]
B: [1, 10, 2]A: [2, 3, 1]
B: [1, 3, 2]
然而,每次尝试提交代码时,网站都会显示“INCORRECT”。它未能通过六个隐藏测试中的两个,我无法弄清原因。这是正确的代码吗?还有其他更简单的方法吗?
copyA = A
并不会复制一个数组,它只是给你另一个对同一数组的引用。因此,原始 数组会被排序。 - RealSkeptic