关于SO上的交集有这样一个问题,但这对我没有帮助。 我有一个严格的规则可以遵循。 原始解决方案
static int solution(int[] A, int[] B) {
int n = A.length;
int m = B.length;
Arrays.sort(A);
Arrays.sort(B);
int i = 0;
for (int k = 0; k < n; k++) {
if (i < m - 1 && B[i] < A[k]) i += 1;
if (A[k] == B[i]) return A[k];
}
return -1;
}
此解决方案是正确的,但并非在所有情况下都适用,例如arr1 = {6,6,6,6} arr2 = {2,4,5,9,6}
不会导致6 因此,任务是仅添加两行代码以使其工作。我添加了
int[] acopy = Arrays.copyOf(A, A.length);
A = n > m ? A : B;
B = n > m ? B : acopy;
n = A.length;
m = B.length;
现在该任务将返回6
但是当数组是这个
int [] x1 = {0,2,7,10,23,345,56,456,767,56,6,80,6,65}; int y1 [] = {1、4、5、9、9、9、80、67、77};
它不返回80现在我不确定应该添加什么,我的代码不应该更改,但是可以添加一行修改。
答案 0 :(得分:4)
就像Mis94所说的,您只需要用较低的值增加边的索引,这是我解决这个问题的方法
static int solution(int[] A, int[] B) {
int n = A.length;
int m = B.length;
Arrays.sort(A);
Arrays.sort(B);
int i = 0;
for (int k = 0; k < n; k++) {
if (i < m - 1 && B[i] < A[k]) { i += 1; k--; continue; }
if (A[k] == B[i]) return A[k];
}
return -1;
}
我希望这遵循指示
答案 1 :(得分:2)
我已经对您添加的原始功能进行了一些修改,但是我不确定这些修改是否满足您所讨论的限制,但是无论如何,这是一个适用于您提到的所有情况的版本:
static int solution(int[] A, int[] B) {
int n = A.length;
int m = B.length;
Arrays.sort(A);
Arrays.sort(B);
int i = 0;
for (int k = 0; k < n && i < m;) {
if (A[k] == B[i]) return A[k];
if (i <= m - 1 && B[i] < A[k]) i += 1;
else if (k <= n - 1 && A[k] < B[i]) k += 1;
}
return -1;
}
在这里,仅当A [k] k,以确保在每次迭代时都递增其值较低的索引。另外,您还需要添加对i < m
的检查,以避免在元素之间不匹配的情况下进行无限循环,因此您成功返回了-1
答案 2 :(得分:2)
用于示例合并方法returns 80的正确代码
static int solution(int[] A, int[] B) {
int n = A.length;
int m = B.length;
Arrays.sort(A);
Arrays.sort(B);
int i = 0;
int j = 0;
while (i < n && j < m) {
if (A[i] == B[j])
return A[i];
else {
if (A[i] > B[j])
j++;
else
i++;
}
}
return -1;
}
答案 3 :(得分:1)
尝试设置和哈希集
Set<Integer> firstSet = new HashSet<Integer>(Arrays.asList(1,2,3,4,5,6));
Set<Integer> secondSet= new HashSet<Integer>(Arrays.asList(2,6,7,8,9,0,1));
firstSet.retainAll(secondSet);
Integer[] commonData= firstSet.toArray(new Integer[firstSet.size()]);
这会将两个Integer数组中的所有公共值都放入commonData