查找两个数组中的值

时间:2019-03-14 01:10:44

标签: java arrays algorithm

关于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现在我不确定应该添加什么,我的代码不应该更改,但是可以添加一行修改。

4 个答案:

答案 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