Ruby-有给定的整数数组。我必须找到具有最大乘积的一对相邻元素

时间:2018-08-18 19:59:15

标签: arrays ruby function

codesignal.com的街机模式下,这件小事真是在杀了我。

问题出在这里

给出一个整数数组,找到乘积最大的一对相邻元素并返回该乘积。 对于inputArray = [3,6,-2,-5,7,3],输出应为 neighborElementsProduct(inputArray)=21。7和3产生最大乘积。

这是我可以管理的代码:

def adjacentElementsProduct(inputArray)
    for check in 0..(inputArray.length-1)
        previous = -5000000000000000000000000000000       
        if check < inputArray.length-1
            name = inputArray[check] * inputArray[check+1]
            chosen = name if name > previous
        end
    end
    return chosen
end

这将为3/9提供正确的答案。

2 个答案:

答案 0 :(得分:6)

def max_product_adjacent_elements(arr)
  arr.each_cons(2).max_by { |x,y| x*y }.reduce(:*)
end

arr = (-50..100).to_a.sample(10)
  #=> [100, 0, 4, 20, -45, 71, 21, 39, 40, -33]

max_product_adjacent_elements(arr)
  #=> 1560 (39*40)

请参见JWE specEnumerable#each_cons

这是另一种方式。

mx = -Float::INFINITY
enum = arr.to_enum
  #=> #<Enumerator: [63, 76, 31, 25, 38, 91, 87, 34, 86, 72]:each>
loop { mx = [mx, enum.next * enum.peek].max }
mx
  #=> 1560

当枚举数在arr中的最后位置时,Enumerable#max_by引发Enumerator#peek通过中断循环处理的StopIteration异常。

答案 1 :(得分:0)

以防万一,有人认为第一个和最后一个元素是相邻的:

def max_product_adjacent_elements_circular(arr)
  prod = 0
  arr.size.times do
    new_prod = arr.rotate![0..1].reduce(:*)
    prod = new_prod if new_prod > prod
  end
  prod
end