给定一个长度为N的数组,我怎样才能将数组的元素均等地分配到另一个任意长度的数组中?
例如,我在一个数组中有3个项目,我希望它在另一个9个插槽的数组中均匀分布。
[1, 2, 3]
应该导致(接近)
[[], [], [1], [], [], [2], [], [], [3]]
但是,如果我有9个项目要分发到数组长度为2,那么它应该导致
[[1,2,3,4], [5,6,7,8,9]]
谢谢!
注意:结果数组项的位置可能因算法而异,但目的是获得一定程度的均匀分布。在第一个例子中,第0个项可能是[1]。在第二个例子中,第0个项目可能有[1,2,3,4,5]。
答案 0 :(得分:2)
这是一种简单的方法:
def distribute(arr, slots)
n = arr.size
a = Array.new(slots) { [] }
arr.each_with_index { |e,i| a[i*slots/n] << e }
a
end
distribute([1,2,3], 9)
#=> [[1], [], [], [2], [], [], [3], [], []]
distribute([*(1..9)], 2)
#=> [[1, 2, 3, 4, 5], [6, 7, 8, 9]]
您可以通过修改i*slots/n
来更改分配结果。
答案 1 :(得分:1)
所以这里有两个完全不同的用例,一个用于构建长度为n的数组,另一个用于需要分割为长度为n的数组。
这感觉就像是一项家庭作业,但我并没有真正从这两个用例中看到一个模式(除非我遗漏了一些巨大的东西)。
测试用例:
it 'splits on n vals' do
arr = [1,2,3]
expect(chunk(arr, 9)).to eq [[], [], [1], [], [], [2], [], [], [3]]
end
it 'splits on n vals' do
arr = [1,2,3,4,5,6,7,8,9]
expect(chunk(arr,2)).to eq [[1,2,3,4,5],[6,7,8,9]]
end
代码:
def chunk(arr, num)
if num < arr.length
return arr.each_slice( (arr.size/num.to_f).round).to_a
end
array = []
len = arr.length
(0..num).each do |i|
if (i % len == 0) && i != 0
array[i-1] = [arr.first]
array[i] = []
arr.shift
else
array[i] = []
end
end
array.pop
array
end