Предположим, 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]
Вы имеете в виду разницу между двумя последовательными элементами?
То, как сформулирован вопрос прямо сейчас, звучит так, будто вам нужны значения min
и max
в массиве, потому что это будут элементы с наибольшей разницей.
Ты можешь это сделать
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 тернарным оператором.
@ VishavKirat07 Карта в основном просто создает новую структуру и возвращается. Нам действительно не нужны эти накладные расходы здесь. Мы не могли использовать тернарный оператор, потому что здесь нет другой части. Кроме того, мы выполняем несколько операторов внутри if. Будет не в лучшем случае.
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);
Потрясающе, Нина. Ясно и лаконично.
Вы можете решить это лаконично с помощью Массив.уменьшить:
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]
палец вверх, Акрион
Спасибо. Рад, что смог помочь.
почему
121
и223
?