在ruby

时间:2018-01-21 21:52:12

标签: ruby

我正在尝试将数字平均分配到给定大小的数组中。如果我有一个数字10和一个数组大小为3,那么我应该将它分配到一个数组中,如下所示:

x = [4, 3, 3]

稍后如果我想将数字增加1,那么我应该从数组中取出(最小的)最小数字,然后一个接一个地更新它们。

x = [4, 4, 3]

稍后如果我想将数字增加2,那么我应该更新数组如下:

x = [5, 4, 4]

更新:

我能够完成第一部分

def split_into n, p
  [n / p + 1] * (n % p) + [n / p] * (p - n % p)
end

split_into(10, 3) #=> [4, 3, 3]

3 个答案:

答案 0 :(得分:3)

一种简单的方法,重复查找并递增最小数字:

var htmlReporter = new ExtentHtmlReporter(ResourcesConfig.ReportPath);
            extent = new ExtentReports();
            extent.AttachReporter(htmlReporter);
            htmlReporter.LoadConfig(ResourcesConfig.ReportXMLPath);
            **htmlReporter.AppendExisting = true;**

演示:

n.times { x[x.index(x.min)] += 1 }

另一种简单的方法,重复使用现有方法,如果n很大则更快:

x = [0, 0, 0]
n = 10

n.times { x[x.index(x.min)] += 1 }
x #=> [4, 3, 3]

n = 4
n.times { x[x.index(x.min)] += 1 }
x #=> [5, 5, 4]

答案 1 :(得分:1)

如果您尝试将某些内容拆分为偶数组,请使用Rails'in_groups_of

(1..10).to_a.in_groups_of(3) #=> [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, nil, nil]]

您还可以通过提供false的第二个参数来指定不填充结尾。

如果您真的想知道群组的大小,可以使用in_groups(略微不同于in_groups_of)来获取群组:

(1..10).to_a.in_groups(3, false).map(&:size) #=> [4, 3, 3]

答案 2 :(得分:0)

您可以通过divmod计算商数和余数:

q, r = 10.divmod(3)
#=> [3, 1]

通过Array.new创建相应的数组:

Array.new(3) { |i| i < r ? q + 1 : q }
#=> [4, 3, 3]

作为一种方法:

def split_into(n, p)
  q, r = n.divmod(p)
  Array.new(p) { |i| i < r ? q + 1 : q }
end

a = split_into(10, 3)
#=> [4, 3, 3]

To&#34;增加&#34;数组1,您可以将1添加到数组&#39; sum并再次致电split_into

a = split_into(a.sum + 1, a.size)
#=> [4, 4, 3]

2

a = split_into(a.sum + 2, a.size)
#=> [5, 4, 4]