Как проверить, одинаковы ли обе стороны массива? | Javascript Алгоритм - PullRequest
1 голос
/ 14 июля 2020

Вопрос

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

Например:

Допустим, вам дан массив {1,2,3,4,3,2,1}: ваша функция вернет индекс 3, потому что при 3-я позиция массива, сумма левой части индекса ({1,2,3}) и сумма правой части индекса ({3,2,1}) равны 6.

Ответ

function findEvenIndex(arr){
  
  for(let i = 0; i <arr.length; i++){
    
       let arr1 = arr.slice(0, (arr[i] - 1));
       let arr2 = arr.slice((arr[i] + 1),);
       
      let arr11 = arr1.reduce((total, item)=>{
         return total + item;
       }, 0);

      let arr22 = arr2.reduce((total, item)=>{
         return total + item;
       }, 0);

      if(arr11 === arr22){
        return arr[i];
      }

  }

  return -1;

}


console.log(findEvenIndex([1, 2, 3, 4, 3, 2, 1]))
console.log(findEvenIndex([1, 100, 50, -51, 1, 1]))
console.log(findEvenIndex([1, 2, 3,4,5,6]))

Я не вижу здесь ошибки, но она дает неверные результаты. Есть идеи?

Ответы [ 3 ]

4 голосов
/ 14 июля 2020

У вас есть эта часть:

   let arr1 = arr.slice(0, (arr[i] - 1));
   let arr2 = arr.slice((arr[i] + 1),);

Это неверно: arr[i]. Это значение , например, [2,4,6,8,10] arr[3]==8. Вы хотите разрезать сам индекс:

   let arr1 = arr.slice(0, i - 1);
   let arr2 = arr.slice(i + 1,);

Обратите внимание: в двух строках есть еще одна ошибка :) Я оставляю это вам. Подсказка: теперь вы вырезаете из массива два значения вместо одного. Выполните следующий код сначала в уме, а затем где-нибудь, где вы проверите свои результаты.

let arr = [0,1,2,3,4]
let x = 2;
console.log(arr.slice(0, x - 1));
console.log(arr.slice(x + 1,));
2 голосов
/ 14 июля 2020

Вы также можете использовать метод массива findIndex, который, мы не должны удивляться, узнав, что он находит индекс в массиве при определенном условии.

const sum = (ns) =>
  ns .reduce ((total, n) => total + n, 0)

const findBalancedIndex = (ns) => 
  ns .findIndex ((_, i) => sum (ns.slice (0, i)) === sum (ns.slice (i + 1)))


console .log (findBalancedIndex ([1, 2, 3, 4, 3, 2, 1]))
console .log (findBalancedIndex ([1, 100, 50, -51, 1, 1]))
console .log (findBalancedIndex ([1, 2, 3, 4, 5, 6]))

Здесь мы включаем простую вспомогательную функцию для нахождения суммы массива, а затем мы передаем функцию findIndex, которая использует ее дважды для элементов перед индексом и тех, кто после него. Для этого мы используем второй параметр функции обратного вызова, index. Это означает, что мы полностью пропускаем первый параметр и вместо того, чтобы называть его чем-то вроде n, мы используем несколько общепринятое соглашение о его вызове _, указывая на заполнитель, который мы не будем использовать. Обратите внимание, что вам не нужно вычитать единицу из правой границы slice, поскольку это граничное значение уже исключено. И, конечно же, другие указали, что вам нужно разрезать индекс, а не значение массива в этом индексе.

Это находит первый правильный индекс. Если вы хотите найти все таких индексов, вам придется использовать другой метод. (То, что возможно иметь более одного, должно быть ясно из таких массивов, как [1, 2, 3, 0, 0, 0, 0, 3, 2, 1] - индексы для всех этих 0 будут работать.)

1 голос
/ 14 июля 2020

вы возвращаете arr [i], когда вам нужно вернуть только i

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...