2016-07-15 90 views
0

有經驗的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

回答

1

下面是僅使用算術數的單個數字相加更快的絕招:

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

相關問題