Javascript 三位数的最大和

Javascript greatest sum of triple digits

我想用 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;
 }

你会想要这样的东西,它使用 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 运算符 return 的最高值。

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

你可以这样做:

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 个数字加在一起,如果它大于当前最大值,则将当前最大值设置为温度值。

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

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

就是这样!

在这种情况下,正则表达式可能效果很好。我不是 RegExp 专家,有人可能会指出这样做的底线吗?

Javascript

var num = 12224999011112,
    matches = num.toString().match(/(.){2}/g),
    sum = 0;

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

document.body.appendChild(document.createTextNode(sum));

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