簡體   English   中英

SockMerchant挑戰Ruby Array#count不計數?

[英]SockMerchant Challenge Ruby Array#count not counting?

因此,我正在HackerHank上進行初學者挑戰,而紅寶石的一種奇怪行為令我感到困惑。

挑戰在於:找到並計算陣列中有多少對。 (襪子對)

這是我的代碼。

n = 100
ar = %w(50 49 38 49 78 36 25 96 10 67 78 58 98 8 53 1 4 7 29 6 59 93 74 3 67 47 12 85 84 40 81 85 89 70 33 66 6 9 13 67 75 42 24 73 49 28 25 5 86 53 10 44 45 35 47 11 81 10 47 16 49 79 52 89 100 36 6 57 96 18 23 71 11 99 95 12 78 19 16 64 23 77 7 19 11 5 81 43 14 27 11 63 57 62 3 56 50 9 13 45)

def sockMerchant(n, ar)
counter = 0
ar.each do |item|
  if ar.count(item) >= 2
    counter += ar.count(item)/2
    ar.delete(item)
  end
end
counter
end

print sockMerchant(n, ar)

問題是,這算不上好。 運行該函數后,在其內部數組中ar仍具有可數對,我通過再次運行來證明這一點。

還有更多。 如果對數組排序,則其行為會有所不同。

這對我沒有意義。

您可以檢查此鏈接上的行為

https://repl.it/repls/HuskyFrighteningNaturallanguage

您正在迭代集合時從集合中刪除項目-可能會發生不良情況。 簡而言之,如果您不想遇到此類問題,請不要這樣做,請參閱:

> arr = [1,2,1]
# => [1, 2, 1] 
> arr.each {|x| puts x; arr.delete(x) }
# 1
#  => [2]

我們永遠不會在迭代中得到2

一個簡單的解決方案(即您的代碼的一個很小的變化)如下所示:

def sock_merchant(ar)
  ar.uniq.sum do |item|
    ar.count(item) / 2
  end
end

基本上是找到所有唯一的襪子,然后為每只襪子計數。

注意,對於數組的每個唯一元素n ,其復雜度為n^2 ,您必須遍歷整個數組才能找到等於n所有元素。

另一種方法是,先將所有襪子分組,然后檢查我們每種類型有幾對:

ar.group_by(&:itself).sum { |k,v| v.size / 2 }

作為ar.group_by(&:itself)ar.group_by { |x| x.itself } ar.group_by { |x| x.itself }將遍歷數組並創建一個哈希,如下所示:

{"50"=>["50", "50"], "49"=>["49", "49", "49", "49"], "38"=>["38"], ...}

通過調用sum ,我們將對其進行迭代,將找到的元素sum/2 )相加。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM