在HackerRank上的JavaScript项目欧拉#1

问题描述:

我在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(); 

您的代码没问题。如果你只是调用console.log(threeFiveMultiples(1000)),它会给你解决方案。不知道所有其他代码是关于什么的,但是这会起作用。

尝试对您的值使用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

的问题是,真正大量的计算占用的时间相当显著量和hackerrank有超时进行计算。你必须找到一个更快的方法来计算正确的输出。

小暗示:算术级数(其在O(1)可能)

+0

哦,所以你说它需要太长的时间,因为我从0到N迭代1,而应该忽略3和5的倍数,而忽略重复? – phao5814

+0

你也可以考虑如何重写数字的总和;) – cyrix