如何将一个整数分解为一个整数数组
可以说我有一些“事物”,例如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| ... }
,我想知道是否有类似的东西,可能会帮助我与此有关。
你可以做到这一点是:
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]
我会拿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
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?
def decompose(qty, group_max)
q, r = qty.divmod(group_max)
(Array.new(q) { group_max }) + (r > 0 ? [r] : [])
end
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]
很好的使用'divmod',但是如果没有余数,您的代码会添加一个'0'。 – Stefan
另一种方法对皮肤的猫:
比方说,我有许多的“东西”,比如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]
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]
虽然此代码片段可能会解决问题,但它并不能解释为什么或如何回答问题。请[请提供您的代码解释](// meta.stackexchange.com/q/114762/269535),因为这确实有助于提高帖子的质量。请记住,您将来会为读者回答问题,而这些人可能不知道您的代码建议的原因。 **标记/评论者:** [仅用于代码的答案,例如这个,downvote,不要删除!](// meta.*.com/a/260413/2747593) –
@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://*.com/questions/40528021/compare-array-of-hashes-and-print-expected-实际结果/ 40539172#40539172)),但是当它不需要时,它只是绒毛。 –
这看起来不错! :) –
谢谢先生:) – Ursus
我不喜欢最后一行,可能有更好的方法。 – Ursus