如何将整数分解为整数数组

时间:2016-11-10 10:34:39

标签: ruby

让我们说我有很多“事情”,例如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

虽然这有效......但并不是那么优雅。我想知道是否可以使用整数或数组结构中的方法来改进此代码。

我发现清洁工做

之类的事情
myarray.map {|x| ... }

我想知道是否有类似的东西可以帮助我。

7 个答案:

答案 0 :(得分: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]

答案 1 :(得分:3)

def decompose(qty, group_max)
  q, r = qty.divmod(group_max)
  (Array.new(q) { group_max }) + (r > 0 ? [r] : [])
end

答案 2 :(得分: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]

答案 3 :(得分: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

答案 4 :(得分: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?

答案 5 :(得分:1)

皮肤猫的另一种方法:

  

让我们说我有很多东西&#34;,例如7。

让我们使用数组来表示每个nil是&#34;&#34;:

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

但是我可以存储这些&#34;东西&#34;最大组&#34; 2&#34;单位:

each_slice可以做到这一点:

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

获取&#34;事物的数量&#34;在每组中:

Array.new(7).each_slice(2).map(&:length)
#=> [2, 2, 2, 1]

答案 6 :(得分: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]