Mini-Max Sum HACKERHANK JS, почему не работает? - PullRequest
0 голосов
/ 19 января 2020

Я не знаю, что не так, моя функция miniMaxSum не суммирует 1 + 3 + 4 + 5. В конце массив результатов превращается в этот [14, 12, 11, 10], когда он должен выглядеть следующим образом [14, 13 , 12, 11, 10]

function miniMaxSum(arr) {
  let results = [];
  let actualValue = 0;
  let skipIndex = 0;

  for (let i = 0; i < arr.length; i++) {
    //skip actual index
    if (i == skipIndex) continue;
    actualValue += arr[i];

    //restart the loop
    if (i == arr.length - 1) {
      skipIndex++;
      results.push(actualValue);
      actualValue = 0;
      i = 0;
    }
  }
  console.log(results);
  console.log(Math.min(...results), Math.max(...results));
}

console.log(miniMaxSum([1, 2, 3, 4, 5]));

Ответы [ 2 ]

0 голосов
/ 19 января 2020

Вы слишком усложняете свой алгоритм, пытаясь проверить, нужно ли вам добавить текущее число к общей сумме или нет. Вместо этого все, что вам нужно сделать, это запустить al oop над вашим массивом, чтобы суммировать все ваши элементы в вашем массиве. Это даст вам общую сумму всех ваших элементов. Затем снова выполните итерацию по вашему массиву. Для каждого элемента в вашем массиве вычтите его из суммы, которую вы только что вычислили, и выведите sh в новый массив. Это даст вам сумму, если вы не будете использовать число в позиции i<sup>th</sup>. Затем вы можете найти минимальное / максимальное значения, используя функции JavaScript Math.min и Math.max.

Вот пример использования .reduce() и .map() для вычисления окончательного результата:

const miniMaxSum = arr => {
  const sum = arr.reduce((s, n) => n+s, 0)
  const results = arr.map(n => sum - n);
  return [Math.min(...results), Math.max(...results)];
}

const [min, max] = miniMaxSum([1, 2, 3, 4, 5]);
console.log(min, max);

Если вы предпочитаете стандарт для циклов, вот реализация вышеупомянутого в более императивном стиле:

const miniMaxSum = arr => {
  let sum = 0;
  for(let i = 0; i < arr.length; i++) { // sum all elements
    sum += arr[i];
  }
  
  let results = [];
  for(let i = 0; i < arr.length; i++) {
    results[i] = sum - arr[i]; // sum minus the current number
  }
  return [Math.min(...results), Math.max(...results)];
}

const [min, max] = miniMaxSum([1, 2, 3, 4, 5]);
console.log(min, max);
0 голосов
/ 19 января 2020

Если вы говорите о этом вопросе.

Когда бы вы ни захотели перезапустить l oop, вы устанавливаете i=0, но соблюдаете что у вас также есть оператор приращения i++ в for l oop, поэтому i начинается с 1, а не 0. Вам нужно установить i=-1, чтобы i=-1+1 = 0 в последующей итерации. После этого вам нужно обработать угловой чехол. Когда skipIndex==arr.length-1, проверьте, если i == arr.length-1. Если да, выполните results.push(actualValue); для последнего значения, а затем for l oop завершится, потому что i < arr.length равен false на следующей итерации.


Код:

function miniMaxSum(arr) {
let results = [];
let actualValue = 0;
let skipIndex = 0;
  
for (let i = 0; i < arr.length; i++) {
    //skip actual index
    if (i == skipIndex){
        if(i == arr.length - 1)
            results.push(actualValue);
        continue;
    }
    actualValue += arr[i];

    //restart the loop
    if (i == arr.length - 1) {
        skipIndex++;
        results.push(actualValue);
        actualValue = 0;
        i = -1;
    }
}
console.log(results);
console.log(Math.min(...results), Math.max(...results));
}

miniMaxSum([1, 2, 3, 4, 5]);

Выход

[ 14, 13, 12, 11, 10 ]
10 14
...