Страницы

Поиск по вопросам

среда, 29 января 2020 г.

2й максимальный элемент в массиве

#javascript #массивы


подскажите как найти наибольший элемент массива после максимального? например при: 

             [5,5] или [5] - null;
             [1,2,3] - 2; 
             [5,5,4,1] - 4;
             [-1,-2,-3,-4,-5,-5] - (-2);


код:

var array = [-1,-2,-3,-4,-5,-5];

function main(array){
  max = array[0];
  afterMax = null;
  for (var i = 0; i < array.length; i++) {
    if (max < array[i]) {
      afterMax = max;
      max = array[i];
    }
    else if(max != array[i] && afterMax < array[i]){
      afterMax = array[i];
    }
  }
  console.log(afterMax);
}

main(array);

    


Ответы

Ответ 1



Пример однострочного решения Math.max.apply(Math,array.filter(function(el){return el < Math.max.apply(Math,array);})) Суть: ищем максимальный элемент, фильтруем его, и снова ищем максимум, это и будет требуемое значение. Что касается вашего вариант, то стоит заменить null На -Infinity начальное значение. Правда, тогда нужно будет добавить проверку в конце, чтобы вернуть null. И еще одно замечание: использовать локальные переменные max, aftermax var array = [-1,-2,-3,-4,-5,-5]; function main(array){ var max = array[0]; var afterMax = -Infinity; for (var i = 0; i < array.length; i++) { if (max < array[i]) { afterMax = max; max = array[i]; } else if(max != array[i] && afterMax < array[i]){ afterMax = array[i]; } } console.log(afterMax === -Infinity ? null : afterMax); } main(array); Еще вариант просто добавить проверку на null перед сравнением var array = [-1, -2, -3, -4, -5, -5]; function main(array) { var max = array[0], afterMax = null; for (var i = 0; i < array.length; i++) { if (max < array[i]) { afterMax = max; max = array[i]; } else if (max != array[i] && (afterMax == null || afterMax < array[i])) { afterMax = array[i]; } } console.log(afterMax); } main(array); И еще вариант с reduce var array = [-1, -2, -3, -4, -5, -5]; function main(array) { var afterMax = array.reduce(function(acc, cur) { switch (acc.length) { case 0: acc.push(cur); break; case 1: if (acc[0] > cur) acc.push(cur) else if (acc[0] < cur) acc.unshift(cur); break; default: if (acc[0] < cur) acc.unshift(cur) else if (acc[0] > cur && acc[1] < cur) acc[1] = curr; } return acc; }, [])[1]; console.log(afterMax); } main(array);

Ответ 2



сортируем массив по возрастанию, находим первое максимальное число, слева от него искомое или нет ничего. function fn(a) { a = a.slice().sort(function(a, b) { return a - b }); return a[a.indexOf(Math.max.apply(null, a)) - 1] }; alert(fn([-1, -2, -5, -25, -125])); //-2 alert(fn([1, 1, 5, 5])); //1 alert(fn([1, 2, 3, 4, 5, 5])); //4 alert(fn([5, 5])) // undefined; alert(fn([1, 2, 3])) // 2; alert(fn([5, 5, 4, 1])) // 4; alert(fn([-1, -2, -3, -4, -5, -5])) // -2;

Ответ 3



Один раз пробежаться по элементам, сохраняя два значения: максимальное и следующее за ним. function secondMax(a) { var m0, m1; for(var i=0; i a[i]) { m1 = a[i]; } else if( m1 <= a[i] && m0 > a[i]) { m1 = a[i]; } } return m1; } var tests = [ [[-1, -2, -5, -25, -125], -2] ,[[1, 1, 5, 5], 1] ,[[1, 2, 3, 4, 5, 5], 4] ,[[5, 5], undefined] ,[[1, 2, 3], 2] ,[[5, 5, 4, 1], 4] ,[[-1, -2, -3, -4, -5, -5], -2] ]; tests.map(function(e){ var result = secondMax(e[0]); document.body.innerHTML += JSON.stringify(e[0]) + " " + (result == e[1] ? "passed" : "failed: " + result) + '
';})

Ответ 4



Линейный (кажется) однострочный, ES6. f=a=>Math.max(...`,${a},`.replace(RegExp(`,${Math.max(...a)}(?=,)`,'g'),'').slice(1,-1).split`,`) PS: Не надо обращать внимания на этот ответ :)

Комментариев нет:

Отправить комментарий