如何在数组中找到前两个连续元素?

使用Ruby 2.4,我有一系列独特的有序数字

[1, 7, 8, 12, 14, 15] 

如何找到差异为1的前两个元素? 例如,上面的数组答案就是“7”和“8”。

你可以使用each_consfind来从对数组中获取第一个元素,其中第二个元素减去第一个元素等于1:

 p [1, 7, 8, 12, 14, 15].each_cons(2).find { |a, b| b - a == 1 } # => [7, 8] 

这里还有三种方法。

#1

 def first_adjacent_pair(arr) (arr.size-2).times { |i| return arr[i, 2] if arr[i+1] == arr[i].next } nil end first_adjacent_pair [1, 7, 8, 12, 14, 15] #=> [7,8] first_adjacent_pair [1, 7, 5, 12, 14, 16] #=> nil 

#2

 def first_adjacent_pair(arr) enum = arr.to_enum # or arr.each loop do curr = enum.next nxt = enum.peek return [curr, nxt] if nxt == curr.next end nil end 

当枚举器enum使用前面的enum.next生成其最后一个元素时, enum.peek会引发StopIterationexception。 该exception由Kernel#loop通过断开循环来处理,之后返回nil 。 另请参见Object#to_enum , Enumerator#next和Enumerator#peek 。

#3

 def first_adjacent_pair(arr) a = [nil, arr.first] arr.each do |n| a.rotate! a[1] = n return a if a[1] == a[0] + 1 end nil end 

见arrays#旋转! 。

简单的例子

  X = [1, 7, 8, 12, 14, 15] X.each_with_index do |item, index| if index < X.count - 1 if (X[index+1]-X[index] == 1) puts item end end end 

这是为教育目的提供的另一种方法:

 arr = [1, 7, 8, 12, 14, 15] arr.each_cons(2).map {|v|v.reduce(:-)}.index(-1) 

一种方法:

 a.each_with_index { |e, i| break [ e, a[i.next] ] if a[i.next] == e.next } #=> [7, 8] 

chunkeach_cons不同,这不会创建数组数组。 一旦发现一对,它也会中断。


基准

 require 'fruity' arr = ((1...1000)).to_a.reverse + [1,2] def first_adjacent_pair(arr) idx = arr.each_index.drop(1).find { |i| (arr[i-1]-arr[i]).abs == 1 } idx ? arr[idx-1, 2] : nil end def first_adjacent_pair2(arr) enum = arr.to_enum loop do curr = enum.next nxt = enum.peek return [curr, nxt] if (curr-nxt).abs == 1 end nil end compare do iceツ { ar = arr.dup; ar.each_with_index { |e, i| break [ e, ar[i.next] ] if ar[i.next] == e.next } } cary { ar = arr.dup; first_adjacent_pair(ar) } cary2 { ar = arr.dup; first_adjacent_pair2(ar) } seb { ar = arr.dup; ar.each_cons(2).find{|a,b| ba == 1} } end #Running each test 64 times. Test will take about 1 second. #cary2 is faster than cary by 3x ± 0.1 #cary is faster than iceツ by 3x ± 0.1 (results differ: [999, 998] vs [1, 2]) #iceツ is faster than seb by 30.000000000000004% ± 10.0%