Я пытаюсь найти ближайшее значение в массиве, используя бинарный поиск.Все работает нормально, пока искомое значение не меньше, чем наименьшее значение в массиве.
К сожалению, отладчик не принес ничего полезного.Поэтому я прошу сообщество сейчас.Вы также можете попробовать код прямо на игровой площадке Xcode.Я попытался изменить другое искомое значение на меньшее значение, как в массиве, но получил ту же ошибку.Ошибка: ошибка: выполнение было прервано, причина: EXC_BAD_INSTRUCTION (код = EXC_I386_INVOP, субкод = 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 значение в четвертом массиве.