-1

标题:确定数组的等边

问题:

我需要帮助编写一个 JS 函数,该函数将递增索引两侧的左右整数相加,直到它返回左右整数和相等的索引和整数。

摘要示例:

注意:“|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 拆分数组,其中左侧和右侧的和相等。

返回:

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

谢谢!

4

2 回答 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 倍!

于 2021-05-31T05:00:17.333 回答
0

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

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]))

于 2021-05-31T04:49:11.950 回答