对整数数组进行拆分、求和和迭代,直到每一边都相等 (Javascript)

Split, Sum and Iterate through an Integer Array Until Each Side is Equivalent (Javascript)

题目:确定数组的等边

问题:

我需要帮助编写一个 JS 函数,该函数对递增索引两侧的左右整数求和,直到 return 左右整数和相等的索引和整数。

抽象示例:

注:“|x|”是分隔左右整数和的索引整数。

//ignore "|x|" when adding each side, and Sum both "Left|x|Right" sides until the Right and Left side are determined "===" (eg.equivalent)

SUM   LEFT <|x|> RIGHT   SUM   CHECK
1  = [|1|2,3,4,3,2,1 ] = 15  //!==
1  = [ 1|2|3,4,3,2,1 ] = 13  //!==
3  = [ 1,2|3|4,3,2,1 ] = 10  //!==
6  = [ 1,2,3|4|3,2,1 ] = 6   //===
10 = [ 1,2,3,4|3|2,1 ] = 3   //!==
13 = [ 1,2,3,4,3|2|1 ] = 1   //!==
15 = [ 1,2,3,4,3,2|1|] = 1   //!==

答案:

在此示例中,整数 4 上的索引 3 拆分数组,其中左侧和右侧总和相等。

Return:

当函数确定左右两边相等时,它应该return索引整数(例如4)。如果在所有迭代过程中双方都不相等,那么它应该 return -1.

谢谢!

看来我只需要切片和减少!

function findEvenIndex(arr)
{
  function sum(arr){
    return arr.reduce(function(a,b){return a+b;},0);
  }

  return arr.findIndex(function(el,i,arr){
    return sum(arr.slice(0, i)) === sum(arr.slice(i+1,arr.length));
  });
}

console.log(findEvenIndex([1,2,3,4,3,2,1]))

您提出的解决方案有效,但对于较大的数组,它的效率可能非常低。

相反,考虑一种保持 运行 总数的方法,这样您就不会经常重新添加数组的整个部分。

function findEvenIndex(arr) {
  let left = 0;
  // get the total of all numbers once
  let right = arr.reduce((a,b)=>a+b, 0);
  for( let i=0; i<arr.length; i++) {
    right -= arr[i];
    if( left === right) return i;
    left += arr[i];
  }
  return -1;
}
console.log(findEvenIndex([1,2,3,4,3,2,1]));

这里是你的解决方案和我的解决方案的时间比较:

function findEvenIndex1(arr)
{
  function sum(arr){
    return arr.reduce(function(a,b){return a+b;},0);
  }

  return arr.findIndex(function(el,i,arr){
    return sum(arr.slice(0, i)) === sum(arr.slice(i+1,arr.length));
  });
}
function findEvenIndex2(arr) {
  let left = 0;
  // get the total of all numbers once
  let right = arr.reduce((a,b)=>a+b, 0);
  for( let i=0; i<arr.length; i++) {
    right -= arr[i];
    if( left === right) return i;
    left += arr[i];
  }
  return -1;
}

console.time("yours-small");
console.log(findEvenIndex1([1,2,3,4,3,2,1]));
console.timeEnd("yours-small");
console.time("mine-small");
console.log(findEvenIndex1([1,2,3,4,3,2,1]));
console.timeEnd("mine-small");

let huge = Array.from({length:10000},(_,i)=>i+1);
huge = huge.concat(huge.slice(0,huge.length-1).reverse());
console.time("yours-big");
console.log(findEvenIndex1(huge));
console.timeEnd("yours-big");
console.time("mine-big");
console.log(findEvenIndex2(huge));
console.timeEnd("mine-big");

即使只有 7 个项目的非常小的数组,我的解决方案也快一个数量级,而更大的数组我的速度快 400 倍!