2016-11-10 82 views
2

可以說我有一些「事物」,例如7如何將一個整數分解爲一個整數數組

但我可以將這些「東西」存儲在最大「2」單位的組中。所以,我需要做的是這樣的:

7 ----> [2, 2, 2, 1] 

最明顯的方法,如果簡單地做一個循環遍歷它

def decompose(qty, group_max) 
    ret = [] 

    while qty > 0 
     if qty < group_max 
      ret.push qty 
      qty = 0 
     else 
      ret.push group_max 
      qty -= group_max 
     end 
    end 

    ret 

end 

decompose 7, 2 

雖然這個工程...這是不是真的ellegant。我想知道如果可能有整數或數組結構中的方法,我可以用它來改善此代碼。

我發現清潔劑做的事情一樣

myarray.map {|x| ... } 

,我想知道是否有類似的東西,可能會幫助我與此有關。

回答

3

你可以做到這一點是:

qty = 15 # say 
group_size = 2 
count_of_groups = qty/group_size 
result = [group_size] * count_of_groups 
remaining = qty % group_size 
result += [remaining] if remaining != 0 
result  # [2, 2, 2, 2, 2, 2, 2, 1] 
2

我會拿Array構造的優勢:第一放慢參數元素的數量,第二個參數的價值。

def decompose(qty, group_max) 
    result = Array.new(qty/group_max, group_max) 
    remainder = qty % group_max 
    remainder == 0 ? result : result.push(remainder) 
end 

decompose(7, 2) 
=> [2, 2, 2, 1] 

甲一行溶液

def decompose(qty, group_max) 
    (Array.new(qty/group_max, group_max) + [qty % group_max]).reject(&:zero?) 
end 
+0

這看起來不錯! :) –

+0

謝謝先生:) – Ursus

+0

我不喜歡最後一行,可能有更好的方法。 – Ursus

2
val, max = 8, 3 
([max] * (val/max)).tap do |arr| 
    arr << val % max unless (val % max).zero? 
end 
#⇒ [3, 3, 2] 

val, max = 7, 2 
([max] * (val/max)).tap do |arr| 
    arr << val % max unless (val % max).zero? 
end 
#⇒ [2, 2, 2, 1] 

甚至:

([max] * (val/max) + [val % max]).reject &:zero? 
3
def decompose(qty, group_max) 
    q, r = qty.divmod(group_max) 
    (Array.new(q) { group_max }) + (r > 0 ? [r] : []) 
end 
3
divmod

人嗎?

qty = 15 # say 
group_size = 2 

d, r = qty.divmod(group_size) 
Array.new(d, group_size) << r # => [2, 2, 2, 2, 2, 2, 2, 1] 
+0

很好的使用'divmod',但是如果沒有餘數,您的代碼會添加一個'0'。 – Stefan

1

另一種方法對皮膚的貓:

比方說,我有許多的「東西」,比如7

讓我們用一個數組來表示,每個nil是一個 「東西」:

Array.new(7) 
#=> [nil, nil, nil, nil, nil, nil, nil] 

但我可以存儲的最大「2」單元組這個「東西」:

each_slice能做到這一點:

Array.new(7).each_slice(2).to_a 
#=> [[nil, nil], [nil, nil], [nil, nil], [nil]] 

要獲得各組的「東西」數量:

Array.new(7).each_slice(2).map(&:length) 
#=> [2, 2, 2, 1] 
0
def decompose(n, grp_size) 
    nbr_groups, remainder = n.divmod(grp_size) 
    [grp_size]*nbr_groups << remainder 
end 

decompose(23, 3) 
    #=> [3, 3, 3, 3, 3, 3, 3, 2] 
+1

雖然此代碼片段可能會解決問題,但它並不能解釋爲什麼或如何回答問題。請[請提供您的代碼解釋](// meta.stackexchange.com/q/114762/269535),因爲這確實有助於提高帖子的質量。請記住,您將來會爲讀者回答問題,而這些人可能不知道您的代碼建議的原因。 **標記/評論者:** [僅用於代碼的答案,例如這個,downvote,不要刪除!](// meta.stackoverflow.com/a/260413/2747593) –

+0

@ScottWeldon,我沒有提供任何解釋因爲我看到沒有必要。我應該使用[Fixnum#divmod](http://ruby-doc.org//core-2.3.0/Fixnum.html#method-i-divmod)和[Array#*](http ://ruby-doc.org/core-2.3.0/Array.html#method-i-2A)給不熟悉這些方法的讀者?除此之外,這個方法很簡單。我同意,當一個答案是複雜的,需要解釋(見[我最近的答案的另一個](http://stackoverflow.com/questions/40528021/compare-array-of-hashes-and-print-expected-實際結果/ 40539172#40539172)),但是當它不需要時,它只是絨毛。 –

相關問題