Как получить элементы с максимальной разницей в одном массиве?

Предположим, a= [3,7, 8,66,121,223,228], как получить элементы с максимальной разницей между ними? У меня есть это решение, но я буду признателен за лучший код, чем этот.

let arr = []
a.sort((a,b)=>{
    return arr.push(a-b)
})
let index = arr.indexOf(Math.max(...arr))
a.sort((a,b)=> a-b).slice(index,index+2) 

Я ожидаю, что результат будет [121,223]

почему 121 и 223?

Nina Scholz 11.06.2019 20:57

Вы имеете в виду разницу между двумя последовательными элементами?

Shahzad 11.06.2019 20:57

То, как сформулирован вопрос прямо сейчас, звучит так, будто вам нужны значения min и max в массиве, потому что это будут элементы с наибольшей разницей.

Jimenemex 11.06.2019 21:04
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
3
123
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ты можешь это сделать

 var a = [3,7, 8,66,121,223,228]
 var difference = 0;
 var pairIndex = 0;

 for(i = 0; i < a.length; i++) {
  var currentItem = a[i];
  var nextItem = a[i+1];
  var currentDifference = Math.abs(currentItem - nextItem);

  if (currentDifference > difference) {
    difference = currentDifference;
    pairIndex = i;
  }
 }

var pair = [a[pairIndex], a[pairIndex + 1]];
return pair;

Красиво, Шахзад. Я думаю, что вместо цикла for мы можем использовать array.map() и заменить оператор if тернарным оператором.

Vishav Kirat 07 11.06.2019 22:57

@ VishavKirat07 Карта в основном просто создает новую структуру и возвращается. Нам действительно не нужны эти накладные расходы здесь. Мы не могли использовать тернарный оператор, потому что здесь нет другой части. Кроме того, мы выполняем несколько операторов внутри if. Будет не в лучшем случае.

Shahzad 11.06.2019 23:03
a= [3,7, 8,66,121,223,228]
let MaxIntervalPosition = 0

for(let i=0;i<a.length-2;i++){
    if (Math.abs(a[i]-a[i+1]) > MaxIntervalPosition) {
        MaxIntervalPosition = i
    }
    return [a[i],a[i+1]]
}

Код ниже возвращает 3 элемента

0 - максимальная найденная разница

1 - Элемент 1 пары.

2 - Элемент 2 пары.

использование оператора reduce для повторения и поиска пары довольно просто. Я не тестировал это с рандомизированным массивом.

const array = [3,7, 8,66,121,223,228];

const maxDiff = (arr) => arr.reduce((a, v, i) =>
                              {
                                if (i === arr.length-1) return a;
                                const diff = Math.abs(v-arr[i+1]);
                                return (diff > a[0]) ? [diff, v, arr[i+1]] : a;
                              }, [0]);



console.info(maxDiff(array));

// use a simple destructure to seperate diff and elements
const  [diff, ...elements] = maxDiff(array);
console.info(elements);
Ответ принят как подходящий

Вы можете проверить каждую пару с последней найденной парой и получить ту, у которой наибольшая дельта.

var array = [3, 7, 8, 66, 121, 223, 228],
    result = array.reduce((r, b, i, { [i - 1]: a }) => {
        if (i === 0) return;
        if (i === 1 || b - a > r[1] - r[0]) return [a, b];
        return r;
    }, undefined);

console.info(result);

Потрясающе, Нина. Ясно и лаконично.

Vishav Kirat 07 11.06.2019 23:31

Вы можете решить это лаконично с помощью Массив.уменьшить:

let maxDiff = arr => arr.reduce((acc, c, i, arr) => {	
  if (i && c - arr[i-1] > arr[i-1] - arr[i-2])
    acc = [arr[i-1], c]
  return acc
}, [])

console.info(maxDiff([3,7,8,66,121,223,228]))      // <-- [121,223]
console.info(maxDiff([3,7,8,66,121,223,228,1000])) // <-- [228,1000]

Идея состоит в том, чтобы начать с элемента первый(i == 1) и оттуда сравнить разницу между последней парой arr[i-1] - arr[i-2] и текущей парой (c - arr[i-1]). Если разница больше, перезапишите аккумулятор, пока не дойдете до конца.

На самом деле вы можете использовать одну строку через:

let maxDiff = arr => arr.reduce((r,c,i,a) => 
  (r = i && c - a[i-1] > a[i-1] - (a[i-2] || 0) ? [a[i-1], c] : r, r), [])

console.info(maxDiff([3,7,8,66,121,223,228]))      // <-- [121,223]
console.info(maxDiff([3,7,8,66,121,223,228,1000])) // <-- [228,1000]

палец вверх, Акрион

Vishav Kirat 07 11.06.2019 23:02

Спасибо. Рад, что смог помочь.

Akrion 11.06.2019 23:03

Другие вопросы по теме