@mukzer

Почему неправильно считается сумма двух минимальных элементов массива?

Тесты проходит, а вот при отправке решения выдаёт ошибку.
codewars

const sumTwoSmallestNumbers = numbers => {  
    const firstMin = Math.min.apply(null, numbers);
    const newArray = numbers.filter(i => i !== firstMin);
    const secondMin = Math.min.apply(null, newArray);
    return firstMin + secondMin;
};

62d7c5755c671719319935.jpeg
62d7c57c0122c361252067.jpeg
  • Вопрос задан
  • 156 просмотров
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
const newArray = numbers.filter(i => i !== firstMin);

Что, если минимальный элемент представлен в нескольких экземплярах? Вы их все выкинете.

Можно найти индекс минимального элемента и фильтровать по индексу:

function sumTwoSmallestNumbers(nums) {  
  const iMin = nums.indexOf(Math.min(...nums));
  return nums[iMin] + Math.min(...nums.filter((_, i) => i !== iMin));
}

Это если идти вашим путём. Но есть и иные способы решить задачу. Например, можно отсортировать массив и взять два крайних элемента:

const sumTwoSmallestNumbers = ([...nums]) => nums
  .sort((a, b) => b - a)
  .slice(-2)
  .reduce((acc, n) => acc + n, 0);

Или, сосчитать, кто сколько раз повторяется и выбирать второе слагаемое в зависимости от количества повторений первого:

function sumTwoSmallestNumbers(nums) {
  const count = Object.entries(nums.reduce((acc, n) => (acc[n] = -~acc[n], acc), {}));
  return +count[0][0] + +count[+(count[0][1] === 1)][0];
}

Или, пройти по массиву один раз, запоминая встреченные элементы, если они меньше тех, что вам уже попадались (т.е., сделать то, чего от вас тут и ожидается - решить задачу с линейной сложностью по времени и константной по памяти):

function sumTwoSmallestNumbers(nums) {
  let min1 = Infinity;
  let min2 = Infinity;

  for (const n of nums) {
    if (n < min1) {
      [ min1, min2 ] = [ n, min1 ];
    } else if (n < min2) {
      min2 = n;
    }
  }

  return min1 + min2;
}

// или

const sumTwoSmallestNumbers = nums =>
  eval(nums.reduce(([ min1, min2 ], n) => 
    n < min1 ? [    n, min1 ] :
    n < min2 ? [ min1,    n ] :
               [ min1, min2 ]
  , [ Infinity, Infinity ]).join('+'));
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы