2017-02-27 71 views
2

我得到了一个问题:如何找到数组中最高的三个数字?

给定一个arrayOfInts,找到你可以从三个 整数获取highestProduct。

输入:var a = [1,7,9,2];预期输出:7 * 9 * 2 = 126

我们将如何解决这个问题?我写了代码但徒劳无功。

function highestProductIntegers(a){ 
    var h1, h2,h3; //three highest number pointers. 

    a.forEach(function(val, index){ 
    if(index=0){ 
     h1 = val; //assign the first element to h1 (Highest 1) 
    } 

    h2 = val; //second to h2 

    if(val > h1){ //if second is greater than h1 make it h1 || h2 || h3 
     h3 = h2; 
     h2 = h1; 
     h1 = val; 
    } 
    else if(val<h1 && val > h2) //keep comparing for all elements. 
     h2 = val; 
    else if(val < h1 && val < h2) 
     h3 = val; 
    else if(val < h1 && val < h2 && val > h3) 
     h3=val; 
    }); 

    return h1*h2*h3; 
} 

有没有更简单或有效的方法来解决这个问题?

+0

排序然后乘以前3个数字。乘法的特性是这样的,你不需要比较产品。最大的数字是最大的产品。 – Forklift

+2

这个问题比看起来更难:请注意,下面的答案都不适用于测试用例'[-50,-10,1,2,3]'。 –

+0

@JeffBowman是的,我已经评论了有关事实的签名答案可能与您的意见有关。 – SaidbakR

回答

9

三个简短的步骤。

  • 按降序对它们进行排序。
  • 将其分片得到三个(最高)整数
  • 使用reduce函数将其乘法并得到结果。

var a = [17, 1, 7, 9, 2, 5, 9, 15, 12, 44], 
 
    r = a.sort((a, b) => b - a).slice(0, 3).reduce((a, b) => a * b); 
 
    console.log(r);

+0

你能解释一下代码中发生了什么吗?你为什么排序,分割和减少?我试图学习切片和减少,会有帮助! @亲爱的用户 – TechnoCorner

+0

@TechnoCorner它是固定的。 –

+0

我知道这是一个业余爱好者的问题。为什么我们需要做功能(a,b){return b-a}?为什么我们不能使用regualr array.sort()? – TechnoCorner

0
function highestProductIntegers(array){ 
array.sort(function(i,k){return k-i;}); 
return array[0]*array[1]*array[2]; 
} 
+4

它应该返回k-i而不是k-1 –

相关问题