在两个数组中找到相同的元素

时间:2013-08-19 11:14:12

标签: java

我试图在两个数组中找到相同的元素,其中元素之间的最大距离必须等于k。

我的两个阵列(大小不同,未分类)A和B,k最大距离。

这就是我所做的,但我不知道哪里有错误......

for (int i = 0; i<A.length; i++){
    for(int j = i; j < k || j < B.length; j++)
        if(A[i] == B[j]){
            //Print on console
            System.out.println(B[i]);
            j = k;
        }
    }
}

例如:

A[3,7,5,9,10,15,16,1,6,2] 
B[4,8,5,13,1,17,2,11] 
k=6

输出应该是5 1 2,但我不知道为什么,我的程序只给我5。谁能帮我理解为什么?

7 个答案:

答案 0 :(得分:1)

for (int i = 0; i < A.length; i++) {
    int startIndex = Math.max(i - k + 1, 0);
    int endIndex = Math.min(i + k, B.length);
    for (int j = startIndex; j < endIndex; j++){
        if (A[i] == B[j]) {
            System.out.println(B[j]);
        }
    }
}

呃,哦,不确定你想要的距离是什么,包括当前元素或排除它。同样重复(在相同范围内)可能是一个需要处理的特殊情况。

答案 1 :(得分:0)

嗯,你有一种奇怪的风格。你为什么要j = i?如果这样做,则不会迭代所有值。

这可能会对你有所帮助。我试了一下它应该有效:

    int[] a = {3,7,5,9,10,15,16,1,6,2};
    int[] b = {4,8,5,13,1,17,2,11};

    int k = 6;

    for (int i = 0; i < b.length; i++) {
        for (int j = 0; j < k || j < a.length; j++) {
            if (b[i] == a[j]) {
                System.out.println(a[j]);
            }
        }
    }

答案 2 :(得分:0)

嗯,你从i开始j,所以它只会迭代B中i之后的元素。

这可能有用

    for (int i = 0; i<A.length; i++){
        for(int j =Math.max(0, i-k) ; j < Math.min(B.length, i+k); j++){
            if(A[i] == B[j]){
                System.out.println(B[j]);
            }
        }
    }

或者:

    for (int i = 0; i<A.length; i++){
        for(int j = 0; j < B.lenght; j++){
            if(A[i] == B[j] && Math.abs(i-j)<=k){
                System.out.println(B[j]);
            }
        }
    }

答案 3 :(得分:0)

试试这个:

for (int i = 0; i<A.length; i++){
            for(int j = 0; j < B.length; j++)
                if(A[i] == B[j] && Math.abs(j-i)<k){
                    //Print on console
                    System.out.println(B[j]);
                }
            }

答案 4 :(得分:0)

这是解决方案。我查了一下,确实有效。

您的错误

  • 您的第二个循环初始化和停止条件错误。它应该从i-k开始(如果它小于0,那么它应该从0开始)并且当j超过i + k时停止。第二个循环应该在数组范围内的i-k和i + k之间运行。
  • 您无条件地将第二个循环变量设置为k,这会导致意外行为。循环可以返回一个旧值,结果为无限循环。
  • 您控制B [j]值,但打印B [i]值。这可能导致数组超出绑定异常。

int [] a = {3,7,5,9,10,15,16,1,6,2};   int [] b = {4,8,5,13,​​1,17,2,11};         int k = 6;

    for (int i = 0; i < a.length; i++) {
        for (int j = ((i - k) < 0 ? 0 : i - k); j < i + k && j < b.length; j++) {

        if (a[i] == b[j]) {
            System.out.println(b[j]);
        }
    }  

    }

答案 5 :(得分:0)

我不明白k应该做什么,但你的方法是O(n^2),这太过分了。

使用集合,您可以非常轻松地找到交叉点:

Set<Integer> aSet = new HashSet<Integer>();
// Adding an element to a set is O(1), this addAll operation is therefore O(n)
Collections.addAll(aSet, A);

// This loop is also O(n), as contains is O(1)
for (int b : B) {
    if (aSet.contains(b)) {
        // this b int is in A and b
    }
}

总的来说,这种方法是O(n)

修改

关于k,我对你所做的事情的理解是你只测试j < k,这解释了为什么只有5个出来。您需要测试i和j之间的距离,该距离由

测试
Math.abs(j-i) < k

答案 6 :(得分:0)

def getSameItems(aList, bList):
    a_max = aList[0]
    b_max = bList[0]
    for item in aList:
        if item > a_max: a_max = item
    for item in bList:
        if item > b_max: b_max = item
    aList_counting = [0] * (a_max + 1)
    bList_counting = [0] * (b_max + 1)

    for item in aList: aList_counting[item] += 1
    for item in bList: bList_counting[item] += 1
    min_item = a_max if a_max < b_max else b_max
    sameList = []
    for i in range(min_item + 1):
        if aList_counting[i] > 0 and bList_counting[i] > 0:
            sameList.append(i)
    return sameList
aList = [1, 7, 2, 2, 8]
bList = [1, 2, 3, 7, 7, 9, 2, 8]
print getSameItems(aList, bList)
[1, 2, 7, 8]

上面的代码用在python语言中,我是中文,所以我的英文很差,不能提供丰富的代码注释,抱歉..我建议你可以使用counting sorting想法,我希望它会帮助你!