在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
提供正确的答案。
答案 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 spec和Enumerable#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