我只是想知道是否有一种好的方法(没有循环)来找到数组的相邻元素之间的差异:
[2, 8, 12] -> [6, 4]
a(n) = a(n+1) - a(n)
答案 0 :(得分:11)
[2, 8, 12].each_cons(2).map{|a, b| b - a} # => [6, 4]
那仍然是几个周期,但你没有看到它们。
答案 1 :(得分:5)
a = [2, 8, 12]
a.map.with_index(1){|e,i| a[i]-e if a[i] }.compact # => [6, 4]
<强>基准强>
require 'benchmark'
a = (1..10000000).to_a
Benchmark.bm(10) do |b|
b.report("each_cons") { a.each_cons(2).map{|a, b| b - a} }
b.report("map_with_index") { a.map.with_index(1){|e,i| a[i]-e if a[i] }.compact }
end
<强>输出强>
user system total real
each_cons 38.298000 0.156000 38.454000 ( 38.561856)
map_with_index 1.435000 0.000000 1.435000 ( 1.428143)
答案 2 :(得分:1)
另一种方法。没有Arup那样快,但差不多:
a.zip(a.rotate).map{|x,y|y-x}.tap(&:pop)