Для сегодняшнего алгоритма мы собираемся написать функцию с именем minimumDistances, которая будет принимать массив a в качестве входных данных.

В этой функции нам дан массив целых чисел. Каждое значение находится по его индексу. Цель этой функции - найти любую пару совпадающих значений в массиве и определить расстояние между этими двумя совпадающими значениями, вычислив разность их индексов. После вычисления различий определите, какая совпадающая пара имеет наименьшее расстояние, и выведите это значение. Если подходящих пар не существует, функция вернет -1. Вот пример:

let a = [2,5,3,7,2,3];

В нашем примере массива выше единственными числами, имеющими совпадающие значения, являются 2 и 3.

Индексы двойки - это a [0] и a [4]. Если вычесть индексы 4 — 0 = 4, мы получим 4.

Индексы тройки - это a [2] и a [5]. Если вычесть индексы 5 — 2 = 3, мы получим 3.

Из двух расстояний (4 и 3) функция вернет минимальное значение расстояния 3.

Давайте превратим это в код.

let distances = [];

Переменная distances будет массивом, который будет содержать расстояния всех совпадающих пар из нашего входного массива.

for(let i = 0; i<a.length; i++){
    if(a.indexOf(a[i]) !== a.lastIndexOf(a[i])){
      let minDistance = a.lastIndexOf(a[i]) - a.indexOf(a[i]);
      distances.push(minDistance);
    }
}

Мы просматриваем наш ввод и внутри нашего массива сначала проверяем, совпадает ли повторяемое число во входном массиве. Мы используем indexOf(), который возвращает индекс первого встречающегося указанного значения. Мы также используем lastIndexOf(), который возвращает индекс последнего появившегося указанного значения. Если оба метода возвращают один и тот же индекс, значит, подходящей пары нет. Если оба метода возвращают разные индексы, это означает, что в массиве есть другое совпадающее число.

let minDistance = a.lastIndexOf(a[i]) - a.indexOf(a[i]);
distances.push(minDistance);

Когда это происходит, мы берем индексы совпадающих чисел и вычитаем их. Мы помещаем различия или расстояние в наш массив distances.

if(distances.length === 0){
    return -1;
}else{
    distances.sort(function(a, b) {
      return a - b;
    });
    
    return distances[0];
}

Если в массиве нет подходящих пар, мы узнаем об этом, потому что наш массив distances останется пустым. Если это правда, мы вернем -1.

Если нет, то вернем наименьшее расстояние. Мы делаем это путем сортировки массива. Мы используем метод sort() вместе с функцией сравнения внутри метода sort() для сортировки нашего массива. Функция сравнения помогает определить порядок сортировки, сравнивая наши значения в виде чисел, а не строк (метод по умолчанию). Это сделано для предотвращения странного порядка сортировки, когда у нас есть массив, содержащий комбинацию однозначных и многозначных чисел.

Теперь, когда наш массив отсортирован от наименьшего к наибольшему, мы заботимся только о наименьшем расстоянии, поэтому мы возвращаем первое значение в массиве distances.

Вот остальной код:

function minimumDistances(a) {
    let distances = [];
    for(let i = 0; i<a.length; i++){
        if(a.indexOf(a[i]) !== a.lastIndexOf(a[i])){
        let minDistance = a.lastIndexOf(a[i]) - a.indexOf(a[i]);
            distances.push(minDistance);
        }
    }
  
    if(distances.length === 0){
        return -1;
    }else{
        distances.sort(function(a, b) {
          return a - b;
        });
    
        return distances[0];
    }
}

Если вы нашли этот алгоритм полезным или полезным, ознакомьтесь с другими моими статьями о решениях для алгоритмов JavaScript: