【发布时间】:2019-11-17 11:18:57
【问题描述】:
我尝试使用二进制搜索在数组中找到最接近的值。只要我要查找的值不小于数组中的最小值,一切正常。
不幸的是,调试器没有提供任何帮助。所以我现在问社区。您也可以直接在 Xcode Playground 中尝试代码。我尝试将其他搜索值更改为数组中的较小值,但得到了相同的错误。 错误:错误:执行被中断,原因:EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)。
func closestValue(_ arr: [Int],_ target: Int) -> Int {
var leftPointer = 0
var rightPointer = arr.count-1
while leftPointer < rightPointer {
let middleIndex = (leftPointer + rightPointer) / 2
let middleValue = arr[middleIndex]
if middleValue == target {
return middleValue
}
//Check for out of bounds error
let leftIndex = middleIndex-1
let leftValue = arr[leftIndex]
if leftValue <= target && middleValue >= target {
let leftDistance = abs(leftValue-target)
let rightDistance = abs(middleValue-target)
if leftDistance <= rightDistance {
return leftValue
} else {
return middleValue
}
}
if middleValue <= target {
leftPointer = middleIndex+1
} else {
rightPointer = middleIndex
}
}
guard let first = arr.first, let last = arr.last else {
fatalError()
}
if target <= first {
return first
} else if target >= last {
return last
} else {
fatalError()
}
}
let first = [1,2,3,5,5,5,7,9,19,11] // 6 --> 5
let second = [1,2,3] // 8 --> 3
let third = [9, 10, 22, 59, 67, 72, 100] // 70 --> 72
let fourth = [100, 101, 102] //5 --> 100 => Heres the error
print(closestValue(first, 6))
print(closestValue(second, 8))
print(closestValue(third, 110))
print(closestValue(fourth, 5))
我期望第四个输出 100。因为 100 是第四个数组中最接近 5 的值。
【问题讨论】:
-
我认为你的问题出在“let leftIndex = middleIndex-1; let leftValue = arr[leftIndex];” middleIndex 可以为零,这将导致 leftIndex 为 -1。
标签: arrays swift binary-search