2015-01-06 2 views
0

Я хочу написать функцию в javascript, которая вычисляет наибольшую сумму из трех последовательных чисел заданного положительного числа.Javascript наибольшая сумма тройных цифр

Так, например 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; 
} 
+2

так ... что именно здесь не работает? –

+1

@ h2ooooooo, переходя к 'i + = 3', перескакивал бы некоторые последовательности, например. он будет вычислять '124' и' 999', но не '249'. – DontVoteMeDown

ответ

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

Thats это!

0

Вы хотели бы что-то вроде этого, который использует Array.splice и Math.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, вы разбиваете массив на фрагменты из трех элементов, а затем используете Array.reduce, чтобы получить сумму этих трех чисел, которые вы нажимаете на другой массив. И затем вы используете Math.max и Function.apply, чтобы получить максимальное значение, которое вы возвращаете, используя оператор return.

+0

Возможно, объясните, почему и как это работает. Отдельно зачем хранить * массив * результатов? –

+0

@ T.J.Crowder код не работает. Я скоро объясню это. –

+0

@ T.J.Crowder ах! Строка concat происходила. Исправлено и объяснено немного –

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

, это код OP, исправленный и читаемый. Я бы предположил, что это полезно для ОП. – hazimdikenli

+0

Теперь, когда у него есть комментарии, это может быть. –

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 числа вместе, и если он больше текущего максимума, установите текущий максимум на значение temp.

0

Это может быть ситуация, когда регулярное выражение будет работать хорошо. Я не эксперт RegExp, и кто-то может указать на пол, делая это так?

Javascript

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

Во-первых, преобразовать число в строку, так что вы можете использовать RegExp. Затем мы сопоставляем все вхождения, где у нас есть 3 одновременных символа. Если у нас есть какие-либо соответствия, мы выбираем математически наибольший. Мы преобразуем это в строку, возьмем первый символ и умножим его на 3.

Смежные вопросы