【问题标题】:Adding numbers together将数字相加
【发布时间】:2015-07-14 14:25:34
【问题描述】:

我想在将数字相加的同时循环遍历一个数组。

在遍历数组时,我想将当前数字添加到下一个。

我的数组看起来像

[0,1,0,4,1]

我想做以下事情;

[0,1,0,4,1] - 0+1= 1, 1+0= 1, 0+4=4, 4+1=5

然后会给我[1,1,4,5] 执行以下操作; 1+1 = 2, 1+4=5, 4+5=9

以此类推,直到我达到 85 岁。

谁能建议最好的方法来解决这个问题

【问题讨论】:

  • 贴出你已经写好的代码。
  • 我认为你可以在复杂度 n*log(n) 中做到这一点请检查分治算法,你可以在概念上而不是结果上做类似的事情。你可以查看这个例子link
  • 如果我继续按照您的方式计算,数组看起来像 {0,1,0,4,1}, {1,1,4,5}, {2,5,9} , {7,14}, {21};并且无法达到 85。对吗?
  • @tobyUCT - 除非[2,5,9] 应该导致[7,1,4],然后是[8,5]。其中两位数的结果被拆分(14 变为 1,4)。
  • @j08691 那么 [8, 5] 应该变成 [13] 不是吗?但随后拆分为 [1, 3] 然后 4 ?

标签: javascript loops for-loop


【解决方案1】:

这个变换遵循指定的求和方法,但我也得到了 21 的最终结果,所以请说明如何得到 85。

var ary = [0,1,0,4,1],
    transform = function (ary) {
        var length = ary.length;
        return ary.reduce(function (acc, val, index, ary) {
            if (index + 1 !== length) acc.push(ary[index] + ary[index + 1]);
            return acc;
        }, []);
    };
while (ary.length !== 1) ary = transform(ary);

【讨论】:

    【解决方案2】:

    如果您确实希望答案是 21(看起来应该如此),那么您真正想做的事与 Binomial Theorem 密切相关。 我对javascript不熟悉,所以我会用c风格的伪代码写一个例子:

    var array = [0,1,0,4,1]
    int result = 0;
    for (int i = 0; i < array.length; i++)
    {
        int result += array[i] * nChooseK(array.length - 1, i);
    }
    

    这将为每个相应的迭代将以下数字放入result

    1. 0 += 0 * 1 --> 0
    2. 0 += 1 * 4 --> 4
    3. 4 += 0 * 6 --> 4
    4. 4 += 4 * 4 --> 20
    5. 20 += 1 * 1 --> 21

    这避免了在尝试迭代创建越来越短的数组时出现的所有令人困惑的数组操作;如果你有一个好的 nChooseK() 实现,它也会更快。 现在,为 nChooseK() 函数找到一个有效的算法是另一回事,但它是一个相对常见的任务,所以它应该不会太难(谷歌搜索“n 选择 k 算法”应该可以正常工作)。有些语言甚至在标准数学库中有组合函数。

    【讨论】:

      【解决方案3】:

      我得到的结果是 21 而不是 85。这段代码可以优化为只使用单个数组。无论如何,它完成了工作。

      var input = [0, 1, 0, 4, 1];
      
      function calc(input) {
        if (input.length === 1) {
          return input;
        }
        var result = [];
        for (var i = 0; i < input.length - 1; i++) {
          result[i] = input[i] + input[i + 1];
        }
        return calc(result);
      }
      
      alert(calc(input));
      这是一个 O(n^2) 算法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-03
        • 2014-06-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多