2017-10-07 71 views
1

我正在使用Kata。鑑於列表lstN,我正在創建一個新列表,其中包含lst的每個元素最多N次而不重新排序。例如,如果N = 2,輸入爲[1,2,3,1,2,1,2,3],我拿[1,2,3,1,2],滴,因爲這下一[1,2]將導致12結果中的3次之中,然後取3,從而導致[1,2,3,1,2,3]刪除符合條件的數組中的最後一個匹配元素

這裏是我的代碼:

def delete_nth(order,max_e) 
    #your code here 
    order.any? do |element| 
    if order.count(element) > max_e 
     order.delete_at(order.index(element)) 
    end 
    end 
    order 
end 

這裏是輸出。

從陣列[20,37,20,21],1你 - 預期:20,37,21],而不是 了:37,20,21]

它擦除數組中符合條件的第一個元素,我需要刪除最後一個元素。

回答

3

@Steenslag和@Stefan對我最初的回答提出了同樣的改進(雖然表達方式不同)。我已經編輯了我的答案,將其改進。

代碼

def doit(arr, n) 
    h = Hash.new(0) 
    arr.select { |e| n >= h[e] += 1 } 
end 

arr = [1,2,3,1,2,1,2,3] 
n = 2 
doit arr, n 
    #=> [1, 2, 3, 1, 2, 3] 

說明

用於arr和在實施例n的值執行的步驟是爲f ollows。

h = Hash.new(0) 

這是Hash::new的形式,它採用默認值,此處爲零。所有這一切意味着,如果上述定義沒有一個關鍵kh,則返回默認值:

h['cat'] #=> 0 

這不會改變的哈希值。如果我們現在寫h[:a] = 1(所以h=>{:a=>1}),那麼h[:a]返回1,因爲h現在有一個密鑰:a。接着,通過enum產生

enum = arr.reject 
    # => #<Enumerator: [1, 2, 3, 1, 2, 1, 2, 3]:reject> 

的第一個值,並傳遞到塊,塊變量被分配它的值。

e = enum.next 
    #=> 1 

塊計算現在執行

h[e] += 1 
    #=> h[e] = h[e] + 1 
    # h[e] = 0 + 1 = 1 

所以現在

h #=> { 1=>1 } 

和因爲

2 >= h[1] 
    #=> true 

arr第一元件被選擇。

關於表達式h[1] = h[1] + 1需要注意兩點。首先,因爲h沒有密鑰1,所以h[1]在等號的右邊返回默認值零。其次,缺省值由方法Hash#[]使用,而不是由Hash#[]=(在等號左邊)使用。

enum的第二個值現在傳遞給塊並執行類似的計算。

e = enum.next 
    #=> 2 
h[e] += 1 
    #=> h[2] = h[2] + 1 
    # h[2] = 0 + 1 
h #=> {1=>1, 2=>1} 
2 >= h[2] 
    #=> true 

所以第二個元素arr也被選中。讓我們跳過被enum產生的未來三個要素:

enum.next 
    #=> 3 
enum.next 
    #=> 1 
enum.next 
    #=> 2 

此時

h = { 1=>2, 2=>2, 3=>1 } 

和塊已經返回各自通過enum產生的第一5元素的truthy值。

接着,

e = enum.next 
    #=> 1 
h[e] += 1 
    #=> h[1] = h[1] + 1 
    # h[1] = 2 + 1 
h #=> {1=>3, 2=>2, 3=>1} 
2 >= h[1] 
    #=> 2 >= 3 => false 

所以這個值,1未選中。其餘的計算是相似的。

+2

'arr.select {| e | (h [e] + = 1)<= n}' – steenslag

+2

'arr.reject {| e | n Stefan

+0

非常感謝,@steenslag和... –

相關問題