我试图找到两个数组的重复项,并且其中一个数组明显更大,所以我在较小的数组上进行迭代,同时在较大的数组上进行二进制搜索以查找数字。但是,我的解决方案没有运行。
function bSearch(arr, num) {
let start = 0
let end = arr1.length - 1
while (start <= end) {
let middle = Math.round(start + end / 2)
if (arr[middle] === num) {
return arr[middle]
} else if (arr[middle] < num) {
start = middle
} else {
end = middle
}
}
return false
}
function dup(arr1, arr2) {
let output = []
let shorterArray = arr1.length > arr2.length ? arr2 : arr1
for (let i = 0; i < shorterArray.length; i++) {
if (bSearch(arr1, shorterArray[i])) {
output.push(shorterArray[i])
}
}
return output
}
let arr1 = [1, 2, 3, 5, 6, 7], arr2 = [3, 6, 7, 8, 20]
dup(arr1, arr2)
// should return [3, 5, 7]
// currently only returns [3]
答案 0 :(得分:1)
这里有许多小问题。
bSearch(arr1, shorterArray[i])
-如果arr1
太短,则仅搜索它。在二进制搜索中,您使用arr1
的长度而不是arr
的初始end
变量声明的长度。
let middle = Math.round(start + end / 2)
-.round()
使用.floor()
舍入不同的方式。
Math.round((start + end) / 2
-start
和end
的添加应放在括号中
二进制逻辑应该在中间增加或减少,否则您将陷入无限循环,即(6 + 6)/2 === 6
因此:
if (arr[middle] === num) {
return arr[middle]
} else if (arr[middle] < num) {
start = middle + 1
} else {
end = middle - 1
}