Равные стороны массива

#javascript #arrays

Вопрос:

Задача: найдите индекс N, где сумма целых чисел слева от N равна сумме целых чисел справа от N. Если нет индекса, который мог бы это сделать, верните -1.

Мое решение

 function findEvenIndex(arr) {  var sum = i =gt; i.reduce((a, b) =gt; a   b),  l = arr.length;   for (let j = 0; j lt;= l; j  ) {  if (sum(arr.slice(0, j - 1)) === sum(arr.slice(j, l))) {  return j  } else {  continue;  }  }  return -1  } 

Когда я бегу findEvenIndex([1,2,3,4,3,2,1]) , он ничего не возвращает. Где ошибка, которая мешает возвращению 3 в случае этого примера?

Я установил процедуру цикла for следующим образом, чтобы посмотреть, что происходит

 for(let j = 0; j lt;= arr.length; j  ){  var left = arr.slice(0, j-1), right = arr.slice(j)  console.log(left, right)  }  /* returns  [1] [3,4,3,2,1]  [1,2] [4,3,2,1]  [1,2,3] [3,2,1] as expected */  

Однако, когда пытаешься утешить.запишите сумму этих массивов:

 function sum(i){ return i.reduce((a, b) =gt; a b)}     var l = arr.length;    for(let j = 0; j lt;= l; j  ){  var left = arr.slice(0, j-1), right = arr.slice(j)  console.log(sum(left), sum(right))  }  

Используя приведенный выше фрагмент, findEvenIndex([1,2,3,4,3,2,1]) возвращает «15 16»?

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

1. Не могли бы вы правильно отступить и объяснить, с чем вы боретесь ? Что не в порядке с вашим решением ?

2. Что неверно в вашем решении? В чем ваша проблема? Что такое образец набора данных[ов], который создает для вас проблему?

3. Ошибка в консоли разработчика должна указывать на то, что вы хотите, чтобы это была проблема. Ваш код неправильно настроен для создания вложенных массивов. Простые строки console.log() прольют свет на то, что вы делаете. for (let j = 0; j lt;= l; j ) { console.log(arr.slice(0, j - 1), arr.slice(j, l));

4. Мне всегда нравится, когда вопрос закрыт, когда я пишу ответ…. Думаю, я не могу показать оператору, как правильно перебирать массив и получать вложенные массивы.

5. Как должен выглядеть ваш код среза: var arr = [0,1,2,3,4,5]; for (let j = 1; j lt; arr.length; j ) { var arrLeft = arr.slice(0,j); var arrRight = arr.slice(j); console.log(arrLeft, arrRight) }

Ответ №1:

ваш цикл for проходит весь путь до l того места, где он должен остановиться l-1


В этом нет необходимости:

 } else {  continue; }  

с точки зрения производительности вам не нужно каждый раз вычислять так много вещей.

Альтернативой может быть постепенное суммирование элементов перед вашим сводом и проверка, равно ли оно половине (сумма всех элементов минус значение сводки).

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

1. В использовании reduce здесь нет ничего плохого….. Ваш совет неверен.

2. ах да, я думал, что по какой-то причине требуется значение инициализации

3. закрывающая скобка, вероятно, помогла бы

4. а? Я думаю, тебе нужно посмотреть еще раз. И вы на самом деле не выяснили причину проблемы.