【问题标题】:Sum of consecutive numbers JavaScript连续数字之和 JavaScript
【发布时间】:2016-05-03 12:25:06
【问题描述】:

给定一个整数数组。

例如:

[1,2,2,2,5,7]

我想输出任何一组连续相同的数字及其总和。

输出应该是:

[1,6,5,7]

关于如何做到这一点的任何想法?

【问题讨论】:

标签: javascript logic


【解决方案1】:

您可以将Array.prototype.reduce() 与临时对象一起使用。

var array = [1, 2, 2, 2, 5, 7],
    result = array.reduce(function (r, a) {
        if (r.last === a) {
            r.array[r.array.length - 1] += a;
        } else {
            r.array.push(a);
            r.last = a;
        }
        return r;
    }, { array: [], last: null }).array;

document.write('<pre>' + JSON.stringify(result,0,4) + '</pre>');

【讨论】:

    【解决方案2】:

    我是这样解决的。

    const sumConsecutives = (s) => {
      let result = [], temp = 0;
      for(let i = 0; i<s.length; i++) {
        if(s[i] === s[i+1]){
          temp += s[i];
        } else if(s[i] !== s[i+1]){
          result.push(temp + s[i]);
          temp = 0;
        }
      }
      return result;
    };
    

    【讨论】:

      【解决方案3】:

      如果您使用 lodash 并想要一个功能变体,您也可以这样做:

      _.chain([1,2,2,2,5,7]).groupBy(_.identity).map(_.sum).value()
      

      【讨论】:

        【解决方案4】:

        我们可以使用迭代来解决这个问题。代码看起来像这样

        var numbers = [1, 2, 2, 2, 5, 7];
        var newNumbers = [];
        
        for (var i = 0; i < numbers.length; i++) {
            numbers = numbers.filter(function(num) {
                return num;
            });
        

        这里我们删除了未定义的元素,这些元素将被删除,因此我们不会重复组。

            var number = numbers[i];
            var nextUnique = numbers.find(function(num) {
                return num != number
            });
            var numbersToFind = numbers.indexOf(nextUnique) - i;
        

        上面,我们正在搜索重复组中的数字个数。

            if (numbersToFind > 0) {
                var numbersGroup = numbers.slice(i, i + numbersToFind + 1);
                var sumNumbers = numbersGroup.reduce(function(num1, num2) {
                    return num1 + num2;
                });
                newNumbers.push(sumNumbers);
                delete numbers[i];
            }
        

        我们使用reduce 函数来总结相同的数字。然后我们将删除原始数字以防止在我们的 newNumbers 数组中重复。

            else {
                newNumbers.push(numbers[i]);
           }
        }
        

        否则,新数字将只是索引处的数字。

        alert(newNumbers);
        

        浏览器兼容性

        需要注意的是,array.prototype.find 函数是一项实验性技术,在 Internet Explorer 或 Opera 上尚不可用。

        【讨论】:

        • 只是一个简短的问题:numbers = numbers.filter(function(num) { return num; }); 为什么?这只会过滤真实的值,但为了什么?
        • 正如我所解释的,为了避免迭代重复的元素,在我执行了 reduce 操作后,我将删除该索引处的元素。这使得元素显示为undefined。这就是为什么我们需要在每次迭代开始时过滤真实元素
        • 也许您应该声明,numbers.find 并非在所有用户代理上都可用...
        猜你喜欢
        • 2022-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多