Чего ему не хватает для прохождения проверки? В замкнутый цикл не впадает, тем не менее пишет про "Exceeded execution timeout of 40 seconds"...

solution.js

import { binarySearch } from './helper.js';

const arr = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ];

console.log(binarySearch(arr, 22));

helper.js

export const binarySearch = (arr, x) => {
// implement binary search algorithm here

	let lengthIsEven, middleKey, length;
	let startKey = 0;
	let endKey = arr.length - 1;

	while (startKey != endKey) {
		length = endKey - startKey + 1;
		length % 2 === 0 ? lengthIsEven = true : lengthIsEven = false;

		if (lengthIsEven) {
			middleKey = length / 2 - 1;
		} else {
			middleKey = Math.round(startKey + length / 2);
			if (arr[middleKey] === x) {
				return middleKey;
			} else {
				--middleKey;
			}
		}

		if (arr[middleKey] === x) {
			return middleKey;
		} else if (arr[middleKey] > x) {
			endKey = middleKey;
		} else {
			startKey = middleKey + 1;
		}
	}
	
	return -1;
}

Обнаружил, что код выдаёт неверный результат при длине массива < 3. Исправил, но результат проверки не изменился: "Exceeded execution timeout of 40 seconds". Теперь точно не могу найти, что не так...

UPD: helper.js

export const binarySearch = (arr, x) => {
// implement binary search algorithm here

	let lengthIsEven, middleKey, length;
	let startKey = 0;
	let endKey = arr.length - 1;

	switch (arr.length) {
		case 0:
			return -1;
		case 1:
			if (arr[startKey] === x) {
				return startKey;
			} else {
				return -1;
			}
		case 2:
			if (arr[startKey] === x) {
				return startKey;
			} else if (arr[endKey] === x) {
				return endKey;
			} else {
				return -1;
			}
		default:
			while (startKey != endKey) {
				length = endKey - startKey + 1;
				length % 2 === 0 ? lengthIsEven = true : lengthIsEven = false;
		
				if (lengthIsEven) {
					middleKey = length / 2 - 1;
				} else {
					middleKey = Math.round(startKey + length / 2);
					if (arr[middleKey] === x) {
						return middleKey;
					} else {
						--middleKey;
					}
				}
		
				if (arr[middleKey] === x) {
					return middleKey;
				} else if (arr[middleKey] > x) {
					endKey = middleKey;
				} else {
					startKey = middleKey + 1;
				}
			}
			
		return -1;
	}
}

    Mechnikoff очень сложный алгоритм.

    Убирай switch, меняй условие != на <= и смотри что получится.

    Постарайся уложиться в 20 строк кода.

      Coderslang_Master, спасибо за замечания - действительно было коряво. Удалось сократить код до 17 строк, но в итоге всё равно "Exceeded execution timeout of 40 seconds" 🙁

      UPD-2: helper.js

      export const binarySearch = (arr, x) => {
      
      	let middleKey, length;
      	let startKey = 0;
      	let endKey = arr.length - 1;
      
      	while (startKey <= endKey) {
      		length = endKey - startKey + 1;
      		middleKey = Math.round(startKey + length / 2 - 1);
      			
      		if (arr[middleKey] === x) {
      			return Math.abs(middleKey);
      		} else if (arr[middleKey] > x) {
      			endKey = middleKey;
      		} else {
      			startKey = middleKey + 1;
      		}
      	}
      	
      	return -1;
      }

        Mechnikoff попробуй создать массив и добавить в него 1 миллион элементов в цикле. Потом выполни на нем поиск любого из добавленных элементов.

        • Mechnikoff ответили на это сообщение.

          Coderslang_Master И что должно было произойти, помимо получения ожидаемого результата?

          Написать ответ...