3

我只是想知道是否有一种好方法(没有循环)来查找数组相邻元素之间的差异:

[2, 8, 12] -> [6, 4]

a(n) = a(n+1) - a(n)
4

3 回答 3

11
[2, 8, 12].each_cons(2).map{|a, b| b - a} # => [6, 4]

这仍然是几个周期,但你看不到它们。

于 2013-11-05T10:22:10.063 回答
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)
于 2013-11-05T10:33:21.120 回答
1

另一种方法。不如 Arup 的方式快,但几乎:

a.zip(a.rotate).map{|x,y|y-x}.tap(&:pop)
于 2013-11-05T12:28:37.767 回答