ПРИХОДИТЕ УЧИТЬСЯ НОВОЙ ПРОФЕССИИ ЛЕТОМ СО СКИДКОЙ ДО 70%Забронировать скидку

Нахождение ближайшего числа в массиве: диапазон -1000 до 1000

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для поиска значения в массиве, которое наиболее приближенно к заданному числу, можно использовать метод Array.prototype.reduce():

JS
Скопировать код
const nearest = (arr, target) => arr.reduce((a, b) => Math.abs(b – target) < Math.abs(a – target) ? b : a);

// Пример использования:
let closestNumber = nearest([5, 20, 12, 16, 25], 15);
console.log(closestNumber); // Выводится: 16

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

Пройдите тест и узнайте подходит ли вам сфера IT
Пройти тест

Будьте осторожны, рассматриваем граничные случаи: "Угадай, где моя кофейная чашка?"

Перед поиском необходимо убедиться, что мы отсекли возможные ошибки.

Проверяем корректность входных данных: цель установлена

Прежде всего, следует гарантировать, что исходные данные подготовлены корректно:

  • Массив arr не должен быть пустым.
  • Все элементы массива обязаны быть числами.
  • Задаваемое значение target обязано находиться в диапазоне от -1000 до 1000.

Теперь код выглядит следующим образом:

JS
Скопировать код
const nearest = (arr, target) => {
  if (!arr.length) throw new Error("Массив пуст. 👻");
  if (!arr.every(Number.isFinite)) throw new Error("Не все элементы массива являются числами. 🕵️");

  if (isNaN(target) || Math.abs(target) > 1000) throw new Error("Значение target выходит за допустимые пределы. 🎯⛔");

  return arr.reduce((a, b) => Math.abs(b – target) < Math.abs(a – target) ? b : a);
};

Упорядоченные массивы: порядок в мире хаоса

При работе с большими объемами данных оптимизация поиска возможна с использованием бинарного поиска, сложность которого составляет O(log N).

  1. Сперва сортируем массив.
  2. Затем мы применяем бинарный поиск для определения ближайшего индекса.
JS
Скопировать код
const binarySearchNearest = (arr, target) => {
  let start = 0, end = arr.length – 1;
 
  while (start <= end) {
    let mid = Math.floor((start + end) / 2);
    if (arr[mid] === target) return arr[mid];  // Обнаружено идеальное совпадение

    arr[mid] < target ? start = mid + 1 : end = mid – 1;  
  }

  const nearest = (arr[start] – target) < (target – arr[end]) ? arr[start] : arr[end];

  return nearest;
};

Каррирование: утонченность в мире программирования

Каррирование обеспечивает возможность многократного использования функции в различных контекстах:

JS
Скопировать код
const curryNearest = target => arr => 
  arr.reduce((a, b) => Math.abs(b – target) < Math.abs(a – target) ? b : a);

let nearestTo15 = curryNearest(15);
console.log(nearestTo15([5, 20, 12, 16, 25])); // Выводится: 16

Специальные сценарии: готовы к нестандартным ситуациям

Теперь мы подготовлены к решению более сложных задач.

Массив содержит целевое значение: точное совпадение!

В случае, если искомое число уже присутствует в массиве:

JS
Скопировать код
if (arr.includes(target)) return target;

Такой подход позволяет увеличить производительность при наличии точного совпадения.

Настройка каррирования: адаптируемся под изменения

С помощью функции curryNearestони можем настроить целевое значение по своему усмотрению:

JS
Скопировать код
const nearestTo10 = curryNearest(10);

Использование библиотек для каррирования: на помощь приходит lodash

Мы можем использовать библиотеки, такие как Lodash, чтобы внедрить функционал каррирования:

JS
Скопировать код
const _ = require('lodash');
const curryNearest = _.curry((target, arr) => arr.reduce(/* ... */));

Визуализация: окунуться в 'Избранное' 🕶️

Поиск ближайшего числа напоминает поиски Нео из фильма "Матрица", который старается найти Оракула:

Markdown
Скопировать код
Матрица: [ 4, 30, 7, 14, 10, 3 ]
Нео (🕶️): 5

Морфеус (Math.abs) помогает в этом поиске:

JS
Скопировать код
const closest = numbers.reduce((prev, curr) => 
  Math.abs(curr – 5) < Math.abs(prev – 5) ? curr : prev);

И наш результирующий выбор:

Markdown
Скопировать код
Оракул: 4 
Будет находиться рядом с истиной, которую ищет Нео (🕶️ 5).

Таким образом, вы научились находить Оракула в "Матрице". 🎯

Полезные материалы

  1. Array.prototype.reduce() – JavaScript | MDN — подробнее о методе reduce.
  2. javascript – Get the closest number out of an array – Stack Overflow — обсуждение способов поиска ближайшего числа на Stack Overflow.
  3. Math.abs() – JavaScript | MDN — описание функции Math.abs() для расчета абсолютного отклонения.
  4. Array.prototype.sort() – JavaScript | MDN — информация о сортировке массивов.
  5. Javascript Program to Find closest number in array – GeeksforGeeks — обзорное руководство по поиску ближайшего числа и осмыслению данного подхода.
  6. JavaScript Arrays – W3Schools — подробный обзор о массивах в JavaScript, где представлены важные базовые знания о работе с массивами.