Codefights:正确的解决方案,但系统不接受它

问题描述:

有经验的codefighters,我刚开始使用Codefight网站学习Javascript。我已经解决了他们的任务,但系统不接受它。任务是将数字中的所有整数(个位数)相加。例如sumDigit(111)= 3。我的代码有什么问题?请帮帮我。Codefights:正确的解决方案,但系统不接受它

代码

function digitSum(n) { 
    var emptyArray = []; 
    var total = 0; 
    var number = n.toString(); 
    var res = number.split(""); 
    for (var i=0; i<res.length; i++) { 
     var numberInd = Number(res[i]); 
     emptyArray.push(numberInd); 

    } 

    var finalSum = emptyArray.reduce(add,total); 

    function add(a,b) { 

     return a + b; 

    } 

    console.log(finalSum); 
    //console.log(emptyArray); 
    //console.log(res); 
} 
+0

您的算法是正确的,所以这必须与Codefighters网站的工作方式有关。你能尝试用'return finalSum;'替换'console.log(finalSum);'吗? – TheHansinator

+0

这可能属于Code Review。但是你的代码的问题很可能是你将数字转换为字符串来分解数字。有一个更有效的方法来做到这一点,只涉及算术和循环。 – pzp

+0

pzp,你是对的我有同样的感觉....我的算法是不好的。 – NZMAI

下面是仅使用算术数的单个数字相加更快的绝招:

var digitSum = function(n) { 
    var sum = 0; 
    while (n > 0) { 
    sum += n % 10; 
    n = Math.floor(n/10); 
    } 
    return sum; 
}; 

n % 10是余当您通过10划分n。实际上,这将检索数字的一位数字。 Math.floor(n/10)n的整数除以10。你可以把它看作是切断一个数字的一​​位数字。这意味着这段代码将总和中的个位加起来,将个位数字(将十位数字向下移到个位数字所在的位置),并重复这个过程直到数字等于零(即,没有数字剩下) 。

这比你的方法更有效的原因是它不需要将整数转换为字符串,这是一个潜在的昂贵的操作。由于CodeFights主要是对算法能力的测试,他们很可能寻找更多的算法答案,这是我在上面解释的答案。

+0

非常感谢帮助! – NZMAI