连续数字之和 JavaScript

Posted

技术标签:

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

给定一个整数数组。

例如:

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

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

输出应该是:

[1,6,5,7]

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

【问题讨论】:

在***.com/a/9229821/1169519上应用代码 哦,同时你删除了你原来的问题! 【参考方案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 并非在所有用户代理上都可用...

以上是关于连续数字之和 JavaScript的主要内容,如果未能解决你的问题,请参考以下文章

一个正整数能否表示成连续个正整数之和

若k个连续正整数之和为525,则k的最大值为多少

编程:求正整数内与7无关(数字中不含7,不是7的倍数)的所有数之和

[bzoj P4504] K个串

Hihocoder1046K个串(线段树)(待解决)

2573: 连续奇数和