我试图在两个数组中找到相同的元素,其中元素之间的最大距离必须等于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
。谁能帮我理解为什么?
答案 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)
这是解决方案。我查了一下,确实有效。
您的错误
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想法,我希望它会帮助你!