【问题标题】:Mini-Max Sum HACKERHANK JS, why isn't working?Mini-Max Sum HACKERHANK JS,为什么不工作?
【发布时间】:2020-01-19 05:22:37
【问题描述】:

我不知道怎么了,我的函数 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]));

【问题讨论】:

  • 该函数要实现的逻辑是什么?你能用英语解释一下输入是如何产生期望的结果的吗?
  • 这翻译为“我的程序没有做某事”。我们真的不确定为什么该输出有效。这里有什么规则?

标签: javascript arrays loops for-loop


【解决方案1】:

您试图检查是否应将当前数字添加到总和中,从而使您的算法过于复杂。相反,您需要做的就是在数组上运行一个循环,以总结数组中的所有元素。这将为您提供所有元素的总和。然后,再次遍历您的数组。对于数组中的每个元素,从您刚刚计算的总和中减去它并将其推入一个新数组。如果您不使用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);

如果你更喜欢标准的 for 循环,这里是上面的一个更命令式的实现:

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

【讨论】:

    【解决方案2】:

    假设您在谈论this 问题。

    无论何时你想重新启动循环,你都在设置i=0,但注意你在for循环中也有增量语句i++,所以,实际上i从1开始,而不是0 .您需要设置i=-1,以便在后续迭代中i=-1+1 = 0。完成此操作后,您需要处理一个角落案例。当skipIndex==arr.length-1时,检查是否i == arr.length-1。如果是,则对最后一个值执行results.push(actualValue);,然后for 循环终止,因为在下一次迭代中i &lt; 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
    

    【讨论】:

      猜你喜欢
      • 2022-08-08
      • 2014-04-18
      • 2022-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-09
      • 1970-01-01
      • 2014-09-03
      相关资源
      最近更新 更多