有没有办法从两个不同的数组中删除相同的值?

时间:2019-04-04 05:30:33

标签: javascript arrays

我是一名初学者程序员,最近发现了Euler Project的问题。我有点迷上了第一个问题,因为这感觉对我来说是正确的难度。

我想做的是在1000以下的数字范围内计算3和5的倍数之和。

因此,我想出了如何创建两个单独的数组,每个数组分别具有3和5的所有倍数。

for (var i = 0; i < 1000; i++) {
    eulerList.push(i);               

    if (i%3 == 0 && i != 0) {
        multiThree.push(i);
    }

    if (i%5 == 0 && i != 0) {
        multiFive.push(i);
    }  

    if (i == 999) {
        var eulerSum = multiThree.concat(multiFive);   
        print("The total sum is " + eulerSum.reduce(getSum));    
    }

现在,当我尝试计算倍数之和时,它给了我错误的结果,经过一会儿思考,我意识到这是因为某些数字在列表中加倍了。

比方说,我在arrayA和arrayB中具有15的整数值,但是我只希望它保留在arrayA中,所以我最终可以计算所有倍数的总和。我将如何处理?我一直被困在这里,在这里阅读并搜索了几个小时,但我无法将头缠住它。 帮助将不胜感激。预先谢谢你!

2 个答案:

答案 0 :(得分:3)

您不需要创建单独的数组来存储它们,也不需要这样做。只需创建一个变量sum并将数字添加到其中即可。下面的代码片段为Euler项目提供了正确的结果。

let sum = 0;
for(let i = 0;i<1000;i++){
  if(i % 3 === 0 || i % 5 === 0) sum += i 
}
console.log(sum)

您可以使用Arithmetic series公式

console.log(333/2*(3 + 999) + 199/2*(5 + 995) - 66/2*(15+990));

如果您仍然想使用两个不同的数组来解决它。然后,创建一个Set(),它将仅保留两个数组中的唯一值。而且无需检查0不会影响总和

let multiThree = [];
let multiFive = [];

for (var i = 0; i < 1000; i++) {              
    if (i%3 == 0) {
        multiThree.push(i);
    }
    if (i%5 == 0) {
        multiFive.push(i);
    }  

    if (i == 999) {
        var eulerSum = [...new Set(multiThree.concat(multiFive))];   
        console.log(eulerSum.reduce((ac,a) => ac+a,0))
           
    }
}

答案 1 :(得分:1)

我们还可以使用Array.reduceArray.some来检查遇到的数字是否可以被3 5整除,如果是true,则将其添加到累加器的累加器中。 Array.reduce回调。

const sum = Array.from({length: 1000})
           .reduce((acc, ele, idx) => acc = ([3, 5].some(e => idx % e === 0)) ? acc + idx : acc, 0);
console.log(sum);