2017-10-22 169 views
0

我在HackerRank上的項目歐拉#1的測試用例遇到了一些麻煩,並希望有人在HackerRank有一些JS經驗可以幫助。在HackerRank上的JavaScript項目歐拉#1

Click here to see the test case results

下面是我的代碼。據我所知,我無法發現任何明顯的邏輯錯誤,因此,如果有人能夠闡明爲什麼我沒有通過所有測試用例以及爲什麼狀態是「中止調用」,我將不勝感激。上面的所有代碼「忽略此線以上」均由HackerRank提供,不屬於解決方案的一部分。

process.stdin.resume(); 
process.stdin.setEncoding('ascii'); 

var input_stdin = ""; 
var input_stdin_array = ""; 
var input_currentline = 0; 

process.stdin.on('data', function (data) { 
    input_stdin += data; 
}); 

process.stdin.on('end', function() { 
    input_stdin_array = input_stdin.split("\n"); 
    main();  
}); 

function readLine() { 
    return input_stdin_array[input_currentline++]; 
} 

/////////////// ignore above this line //////////////////// 

function threeFiveMultiples(num) { 
    let array = []; 
    for (let i = 0; i < num; i++) { 
     if (i % 3 === 0 || 
      i % 5 === 0) { 
      array.push(i); 
     }  
    } 
    return array.reduce(function(accum, currVal) { 
     return accum + currVal; 
    }); 
} 

function main() { 
    var t = parseInt(readLine()); 
    for(var a0 = 0; a0 < t; a0++){ 
     var n = parseInt(readLine()); 
     let res = threeFiveMultiples(n); 
     console.log(res); 
    } 
} 

我也試過使用BigNumbers庫(見下文)。

process.stdin.resume(); 
process.stdin.setEncoding('ascii'); 

var BigNumber = require('bignumber.js'); 
var input_stdin = ""; 
var input_stdin_array = ""; 
var input_currentline = 0; 

process.stdin.on('data', function (data) { 
    input_stdin += data; 
}); 

process.stdin.on('end', function() { 
    input_stdin_array = input_stdin.split("\n"); 
    main();  
}); 

function readLine() { 
    return input_stdin_array[input_currentline++]; 
} 

/////////////// ignore above this line //////////////////// 

function threeFiveMultiples(num) { 
    let array = []; 
    for (let i = 0; i < num; i++) { 
     if (i % 3 === 0 || 
      i % 5 === 0) { 
      array.push(i); 
     }  
    } 

    return parseInt(array.reduce(function(accum, currVal) { 
     accum = new BigNumber(accum); 
     currVal = new BigNumber (currVal); 
     return accum.plus(currVal); 
    })); 
} 

function main() { 
    var t = parseInt(readLine()); 
    for(var a0 = 0; a0 < t; a0++){ 
     var n = parseInt(readLine()); 
     let res = threeFiveMultiples(n); 
     console.log(res); 
    } 
} 

UPDATE:

每@ 5AR的建議,我代替我的降低與下面的函數;然而,測試案例#2和#3仍然失敗:

return array.reduce(function(accum, currVal) { 
    return accum.plus(currVal); 
}, new BigNumber(0)).toString(); 

回答

2

您的代碼沒問題。如果你只是調用console.log(threeFiveMultiples(1000)),它會給你解決方案。不知道所有其他代碼是關於什麼的,但是這會起作用。

2

嘗試對您的值使用Math.round()(合計之後),JavaScript會將所有數字視爲雙打,因此有些可能無法正確顯示。

如果大數字是問題,請嘗試找到一個可以處理大數字的庫。如果你不能,你可以通過字符串自己實現它們,因爲你只需要總結它就不會那麼困難。

 

UPDATE:

我想回報可能是問題(你使用parseInt這可能是BigNumber轉換爲字符串,然後嘗試分析它作爲Number)試着這樣做:

return array.reduce(function(accum, currVal) { 
    return accum.plus(currVal); 
}, new BigNumber(0)).toString(); 
+0

謝謝回答。我首先嚐試了Math.round(),並沒有對這兩個測試用例有所幫助,然後我嘗試使用BigNumber庫(第一次使用外部庫,因爲我一般對編程相當陌生),但也沒有這樣做,工作。我編輯了我的帖子,將我的解決方案包含在BigNumber庫中。 – phao5814

+0

在你對BigNumber解析了一些東西后,不要使用'parseInt',用BigNumber計算所有東西,最後只做'toString()'。 – 5ar

+0

感謝您的更新。我剛剛給你的解決方案又去了,它並沒有幫助不幸。測試用例#2和#3仍然失敗,狀態爲「Abort Called」。我已更新我的帖子以包含您的建議。 – phao5814

0

的問題是,真正大量的計算佔用的時間相當顯著量和hackerrank有超時進行計算。你必須找到一個更快的方法來計算正確的輸出。

小暗示:算術級數(其在O(1)可能)

+0

哦,所以你說它需要太長的時間,因爲我從0到N迭代1,而應該忽略3和5的倍數,而忽略重複? – phao5814

+0

你也可以考慮如何重寫數字的總和;) – cyrix