Javascript三位数的最大总和

时间:2015-01-06 13:54:42

标签: javascript algorithm

我想用javascript编写一个函数来计算给定正数的3个连续数的最大总和。

因此,例如124999012将计算27。

我已经编写了一个计算数字位数之和的函数:

function sumDigits(n)
{
    var str = n.toString();
    var result = 0;

    for(var i = 0; i < str.length; i++)
    {
        result = result + parseInt(str.charAt(i));
    }
    return result;
 }

5 个答案:

答案 0 :(得分:1)

我有点无聊所以我也做了自己的算法。这是我的解决方案:

function sumDigits(n) {
  return Math.max.apply(null, Array.prototype.map.call("" + n, function (s, ix) {
    return [+s, +n.toString()[ix + 1], +n.toString()[ix + 2]]
      .reduce(function (prev, curr) { return prev + (curr || 0) });
  }));
}

当然,the fiddle

一步一步:

1)将数组转换为三个元素的数组,即当前元素和接下来的2个元素:

Array.prototype.map.call(n.toString(), function (s, ix) {
  return [+s, +n.toString()[ix + 1], +n.toString()[ix + 2]];
});

2)获取数组中每个项目的三个元素的总和:

item.reduce(function (prev, curr) { return prev + (curr || 0) });
对于数组的最后一个元素,

curr将是未定义的,因此它可能会转换为0

3)获取最后一个数组的max

Math.max.apply(null, array);

多数民众赞成!

答案 1 :(得分:0)

您会想要使用Array.spliceMath.max

这样的内容
function highestNum(n){
  var arr = [], nArr = (n+"").split("");
  while(nArr.length > 0)
     arr.push(nArr.splice(0,3).reduce(function(t, c){ return +t + +c }, 0));
  return Math.max.apply(null, arr);
}

它正在做的是,首先它将数字转换为字符串,然后使用Array.splice,将数组拆分为3个元素的片段,然后使用Array.reduce得到这三个元素的总和你推入另一个数组的数字。然后,您使用Math.maxFunction.apply获取使用return运算符返回的最高值。

答案 2 :(得分:0)

function sumDigits(n)
{
    var str = n.toString();
    var result = 0;
    var temp=0;

    //for safety check length of the string
    // if it is not longer than 3 characters then just sum them up and return
    if (str.length<=3)
    {
      for(var i = 0; i < Math.Min(3,str.length); i++)
         result += parseInt(str.charAt(i));
    }
    else
    {
      //now look for biggest 3 consecutive numbers,
      //you wanna sum up 3 digits starting at index 0, and compare it with the max value you have calculated so far
      for(var i = 0; i < str.length-3; i++)
      {
          //calculate the sum of 3 consecutive numbers starting at index i
          temp = parseInt(str.charAt(i)) + parseInt(str.charAt(i+1)) + parseInt(str.charAt(i+2));
          //compare it to the current max, if it is greater than the current max, set it as the result
          if (temp>result)
              result = temp;
      }
    }
    return result;
 }

答案 3 :(得分:0)

你可以这样做:

function sumDigits(number)
{
    var numberString = "" + number;
    var max = -1;
    for(var i = 0; i < numberString.length - 3; i++)
    {
        var number1 = parseInt(numberString.charAt(i));
        var number2 = parseInt(numberString.charAt(i + 1));
        var number3 = parseInt(numberString.charAt(i + 2));
        var tempTotal = number1 + number2 + number3;
        if(tempTotal > max)
        {
            max = tempTotal;
        }
    }
    window.alert("" + max);
    return max;
}

您可以从前三位开始循环,直到您测试了3个连续数字的每个组合。只需将3个数字加在一起,如果它大于当前最大值,则将当前最大值设置为临时值。

答案 4 :(得分:0)

这可能是正则表达式运行良好的情况。我不是RegExp专家,有人可能会指出这样做吗?

的Javascript

&#13;
&#13;
var num = 12224999011112,
    matches = num.toString().match(/(.)\1{2}/g),
    sum = 0;

if (matches) {
    sum = Math.max.apply(null, matches).toString().charAt() * 3;
}

document.body.appendChild(document.createTextNode(sum));
&#13;
&#13;
&#13;

首先,将数字转换为字符串,以便您可以使用RegExp。然后,我们匹配所有出现3个并发字符的事件。如果我们有任何匹配,那么我们选择数学上最大的。我们将其转换为字符串,取第一个字符并乘以3。