2011-06-06 16 views
1

如果我有一個排序數組,我該如何找到序列號?順便說一句,這是爲了確定一個撲克牌手是否是直的。數組中的重複項已被刪除。我可以做到這一點,但這將是一個多線方法,我認爲可能會有一個使用Enumerable方法的快速班輪。如何返回數組中可能存在的一組連續數字?

例如:

FindSequence([9,8,7,5,4]) = [9,8,7] 
FindSequence([4,2,0]) = nil 
+2

關於序列長度的任何其他要求也許?如果有兩個序列,它應該如何表現? – 2011-06-06 23:04:28

+2

一般來說,在你問這樣的問題之前,你會想嘗試一些東西。你有什麼嘗試?你在用什麼? – 2011-06-06 23:06:25

+0

對不起,我不清楚。我編輯了我的問題。 – 2011-06-06 23:12:59

回答

3

假設它是公關esorted,你可以很容易地測試直,像這樣:

array.each_cons(2).all? { |x,y| y == x - 1 } 

爲了安全起見,你可能要添加排序:

array.sort.each_cons(2).all? { |x,y| y == x + 1 } 

但如果你真的需要提取的最大的序列,它會採取另一種解

+0

我想出了這個基於你的幫助。 ary.uniq.sort.reverse.each_cons(5){| a | p a if a [0] == a [4] + 4} 謝謝! – 2011-06-07 02:14:36

+0

現在我有同樣的問題,這種解決方案看起來不錯,但是...!在撲克直線上不僅有2,3,4,5,6而且還有K,A,2,3,4。任何想法如何處理它? – Leo 2013-02-19 23:18:30

+0

@KubaPolaczek創建一個Card類,在Enumerable中混合,並且可以將2,3,4,... J,Q,K,A定義爲排序和其他Enumerable風格操作的序列。但是,K,A,2,3,4在我所知的任何撲克遊戲中都不是筆直的。 – 2013-02-19 23:48:06

8

在1.9.2,神祕slice_before方法加入到枚舉。你可以利用它:

def find_sequences_desc(a) 
    prev = a[0] 
    a.slice_before { |cur| 
    prev, prev2 = cur, prev # one step further 
    prev2 - 1 != prev  # two ago != one ago ? --> new slice 
    }.to_a 
end 
# find_sequences_desc [9,8,7,4,4] #=> [[9, 8, 7], [4], [4]] 
# find_sequences_desc [9,8,7,5,4] #=> [[9, 8, 7], [5, 4]] 

def find_sequences_asc(a) 
    prev = a[0] 
    a.slice_before { |cur| 
    prev, prev2 = cur, prev # one step further 
    prev2 + 1 != prev  # two ago != one ago ? --> new slice 
    }.to_a 
end 
# find_sequences_asc [1,2,4,5,7] #=> [[1, 2], [4,5], [7]] 
# find_sequences_asc [1,2,3,5,6] #=> [[1, 2, 3], [5, 6]] 

你可以得到你所需要的語義與

def find_longest_sequence(a) 
    s = find_sequences_desc(a).max 
    s unless s.size <= 1 
end 

更新

的Ruby 2.2增加了slice_when方法,從而簡化代碼很多:

def find_sequences_desc(a) 
    a.slice_when { |prev, cur| 
    cur != prev - 1 
    }.to_a 
end 
# find_sequences_desc [9,8,7,4,4] #=> [[9, 8, 7], [4], [4]] 
# find_sequences_desc [9,8,7,5,4] #=> [[9, 8, 7], [5, 4]] 
+0

p find_sequences [1,3,4, 5,6]#=> [[1],[3],[4],[5],[6]]失敗? – eastafri 2013-01-22 17:47:51

+0

它只搜索減少的序列 – 2013-01-23 02:20:55

1

如果你說你已經排序並刪除重複項,那麼如果數組的第一個元素和最後一個元素之間的差值等於它們的索引之間的差異,則該數組是順序的。 (我在這裏是模糊的,因爲我相信我的答案可以推廣。)

相關問題